1. 程式人生 > >PHP 搜尋功能的思路 (分詞+匹配)

PHP 搜尋功能的思路 (分詞+匹配)

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 搜尋功能的實現(分詞、匹配)