PHP 搜尋功能的思路 (分詞+匹配)
阿新 • • 發佈:2019-02-06
1. 最簡單的搜尋 (利用like語句匹配)
此搜尋只能用於單個單詞的搜尋
例如:使用者暱稱的搜尋,群名稱的搜尋等
2. 真正的搜尋 (分詞+匹配)
這種方式可用於資料段的搜尋,像對文章內容標題進行檢索等
原理:
利用 Mysql中的全文搜尋match against
實現步驟
1.使用Mysql全文檢索fulltext的先決條件:
- 表的型別必須是MyISAM (MySQL5.6 後Innodb也可以)
- 建立全文檢索的欄位型別必須是char,varchar,text
2.建立全文檢索先期配置(配置mysql)
- 由於Mysql的預設配置是索引的詞的長度是4,所以要支援中文單字的話,首先更改這個.
*Unix使用者要修改my.cnf,一般此檔案在/etc/my.cnf,如果沒有找到,先查詢一下find / -name ‘my.cnf’
在 [mysqld] 位置內加入:
ft_min_word_len = 2
其它屬性還有
ft_wordlist_charset = gbk
ft_wordlist_file = /home/soft/mysql/share/mysql/wordlist-gbk.txt
ft_stopword_file = /home/soft/mysql/share/mysql/stopwords-gbk.txt
稍微解釋一下:
ft_wordlist_charset 表示詞典的字符集, 目前支援良好的有(UTF-8, gbk, gb2312, big5)
ft_wordlist_file 是詞表檔案, 每行包括一個詞及其詞頻(用若干製表符或空格分開,消岐專用)
ft_stopword_file 表示過濾掉不索引的詞表, 一行一個.
ft_min_word_len 加入索引的詞的最小長度, 預設是 4, 為了支援中文單字故改為 2
3.建立全文檢索(表中新增索引)
- 在建表中用FullText關鍵字標識欄位,已存在的表用 ALTER TABLE (或 CREATE INDEX) 建立索引
CREATE fulltext INDEX index_name ON table_name(colum_name);
4.使用全文檢索(SQL語句)
- 在SELECT的WHERE字句中用MATCH函式
- 整體語法:MATCH(col1,col2,…) AGAINST (expr[search_modifier])。
- 其中MATCH中的內容為已建立FULLTEXT索引並要從中查詢資料的列
- AGAINST中的expr為要查詢的文字內容,
- search_modifier為可選搜尋型別。
- search_modifier的可能取值有:
- IN NATURAL LANGUAGEMODE、IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION、IN BOOLEAN MODE、WITH QUERY EXPANSION。
- search_modifier的每個取值代表一種型別的全文搜尋,分別為自然語言全文搜尋、帶查詢擴充套件的自然語言全文搜尋、布林全文搜尋、查詢擴充套件全文搜尋(預設使用IN NATURAL LANGUAGE MODE)。
SELECT * FROM articles WHERE MATCH (tags) AGAINST ('旅遊' IN BOOLEAN MODE);
實現程式碼
詳見下一篇文章
PHP 搜尋功能的實現(分詞、匹配)