全文檢索在 MySQL 中就是一個 FULLTEXT 類型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時或之後使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、 VARCHAR 或 TEXT 列上建立
對于大的資料庫,将資料裝載到一個沒有 FULLTEXT 索引的表中,然後再使用 ALTER TABLE (或 CREATE INDEX) 建立索引,這将是非常快的。将資料裝載到一個已經有 FULLTEXT 索引的表中,将是非常慢的。
1.使用Mysql全文檢索fulltext的先決條件
表的類型必須是MyISAM
建立全文檢索的字段類型必須是char,varchar,text;Full-Text 在5.6之前 隻能用于 MyISAM ,5.6開始 可用于InnoDB
在電商項目中,最核心的功能之一就是搜尋功能,搜尋做的好,整個電商平台就是個優秀的平台。一般搜尋功能都使用搜尋引擎如Lucene、solr、elasticsearch等,雖然這功能比較強大,但是對于一些小公司或者小的電商平台項目有點大材小用了,對于小項目我們可以采用折中的方法,使用ik+MySQL的搜尋引擎進行查詢,ik用于分詞,mysql利用match和against函數進行模糊查詢。先寫下mysql的match和against的用法。
1、給mm_product表name,label字段添加fulltext索引。
ALTER TABLE `pre_home_blog` ADD FULLTEXT INDEX `subject` (`subject`);
1 2、使用match和against函數
2 select * from pre_home_blog where match(subject) against('狂人 日記');
以上就可以實作全文搜尋了,那麼在 thinkphp 裡面我們該怎麼寫呢?當然了可以直接用原生的sql寫法,但是這種畢竟也不 安全。廢話不多說了,直接上案例:
$where['part_id'] = ['=', ':part_id'];
$bind['part_id'] = [$this->part_id, \PDO::PARAM_STR];
$columns = 'blogid,uid,username,subject,viewnum,hot,noreply,friend,sharetimes';
$list = Db::name('pre_home_blog')
->field($columns)
->where($where)
->where(function ($query) use ($uids, $blogids,$filter) {
if(isset($filter['name']) && !empty($filter['name'])){
$query->where("MATCH (name) AGAINST ('{$filter['name']}' IN NATURAL LANGUAGE MODE)");
}
if(isset($filter['username']) && !empty($filter['username'])){
$query->where("MATCH (username) AGAINST ('{$filter['username']}' IN NATURAL LANGUAGE MODE)");
}
if($uids){
$query->whereIn('uid', $uids);
}
if($blogids){
$query->whereIn('blogid',$blogids);
}
})
->bind($bind)
->page($this->page, $this->limit)
->select()
->toArray();
以上通過 查詢部落格名和使用者名,在500萬多的資料也是秒查詢出結果的,也就是通過閉包的方式,IN BOOLEAN MODE就是包含關鍵字就可以查出來,比sphinx,elasticsearch這種要簡便多了,當然了這種隻是在大表中優化惡意,要實作精準的搜尋還隻能用
elasticsearch這些引擎來搜尋。