我們在 MySQL 資料中可以使用 match against 語句解決中文全文搜尋的問題
先看一個例句:
SELECT * FROM v9_search WHERE `siteid`= ‘1’ AND `typeid` = ‘3’ AND MATCH (`data`) AGAINST (‘基地 教育 韓天衡’ IN BOOLEAN MODE);
想要此語句生效需要滿足以下幾個條件:
1,表’v9_search’ 的型別必須是 MyISAM
2,欄位’data’ 的型別必須是 char,varchar,text
3,欄位’data’ 上建立全文檢索(FULLTEXT)
4,欄位’data’ 中的資料為空格分隔的中文分詞,例如:韓天衡先生繪畫 韓天衡 繪畫 先生 先生 繪畫
5,mysql 索引詞的最小長度不大於 2
其中 1-4 條常用,第五條需要修改 mysql 配置,配置項為:ft_min_word_len
檢視 Mysql 配置項的命令如下:
show VARIABLES like ‘ft_%’;
一般情況下,ft_min_word_len 為 4,修改此引數,需要在配置檔案 [mysqld] 位置內加入如下配置:
ft_min_word_len = 2
不能使用:set GLOBAL ft_min_word_len = 2; 語句強制修改。
引數修改之後,重新啟動 mysql 服務,並且重新建索引,重建索引命令如下:
REPAIR TABLE tbl_name QUICK;
如果資料表中記錄較多,重建索引花費時間較長,需耐心等待幾秒鐘。
MySQL 全文搜尋 match against 的用法
對於大的資料庫,將資料裝載到一個沒有 FULLTEXT 索引的表中,然後再使用 ALTER TABLE  (或 CREATE INDEX) 建立索引,這將是非常快的。將資料裝載到一個已經有 FULLTEXT 索引的表中,將是非常慢的。
1. 使用 Mysql 全文檢索 fulltext 的先決條件
表的型別必須是 MyISAM
建立全文檢索的欄位型別必須是 char,varchar,text
2. 建立全文檢索先期配置
由於 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. 使用全文檢索
在 SELECT 的 WHERE 字句中用 MATCH 函式, 索引的站群關鍵詞 TDK 用 AGAINST 標識,IN BOOLEAN MODE 是隻有含有關鍵字就行, 不用在乎位置, 是不是起啟位置.
SELECT * FROM articles WHERE MATCH (tags) AGAINST (‘旅遊’ IN BOOLEAN MODE);
5. 詳細的說明請引數 Mysql 官方網站
http://dev.mysql.com/doc/refman/5.1/zh/functions.html#fulltext-search
這是 Mysql 5.1 的, 不過 4.X 也可以做為參考, 基本一置. 我用的就是 Mysql 4.1.
MySQL 支援全文索引 (Full-Text) 已經很久了,目前,fulltext 是一種只適用於 MyISAM 表的一個索引型別,而且對定義索引列的資料型別也有限制,只能是以下三種的組合 char 、 varchar 、 text 。 fulltext 可以在建立表的同時就一起定義好,或者在表建立完成之後,透過語句 alter table 或 create index 來追加索引,總之先後的效果是一樣的,但是兩者的效率卻是存在很大差異的,大量的實驗證明,對於大數量的表來說,先載入資料再來定義全文索引的 速度要遠遠優於在一個已經定義好全文索引的表裡面插入大量資料的速度。一定會問:這是問什麼呢?其實,道理很簡單,前者只需要一次性對你的索引列表進行操 作,排序比較都是在記憶體中完成,然後寫入硬碟;後者則要一條一條去硬碟中讀取索引表然後再進行比較最後寫入,自然這樣速度就會很慢。 MySQL 是 透過 match() 和 against() 這兩個函式來實現它的全文索引查詢的功能。 match() 中的欄位名稱要和 fulltext 中定義的欄位一致,如 果採用 boolean 模式搜尋,也允許只包括 fulltext 中的某個欄位,不需要全部列出。 against() 中定義的是所要搜尋的字串以及要求資料 庫透過哪種模式去執行全文索引的搜尋查詢。
家用一下 SEO 站群搜尋引擎就會發現,分詞的情況只是出現在當整詞命中為 0 的情況下。
而具體怎樣分詞,大家可以參考一下 baidu 搜尋試驗結果:
·如果搜 “徐祖寧寧”,結果為 “徐祖”+“寧寧” 。(搜人名的情況下,它可能有一個百家姓詞典,自動將姓後第一個字歸前)
·搜 “徐寧願”,結果為 “徐寧願” 。(說明 “寧願” 歸 “徐” 所有。同上。因為徐是姓。)
·搜 “徐祖寧願”,結果為 “徐祖”+“寧願” 。(因為 “寧願” 是詞,故 “徐” 只帶 “祖” 。)
·搜 “徐祖寧高”,結果為 “徐祖寧” 。(因為 “寧高” 不是關鍵字,所以 “寧” 歸前詞所有。而 “高” 可能因為是單字,為提高前詞搜尋效率故被省略。)