天天看點

thinkphp Mysql MATCH() AGAINST() 的用法和 寫法

全文檢索在 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這些引擎來搜尋。

繼續閱讀