MySQL 全文索引的原理與缺陷
MySQL全文索引一種特殊的索引,它會把某個資料表的某個資料列出現過的所有單詞生成一份清單。
alter table tablename add fulltext(column1,column2)
說明:
只能在MyISAM資料表中建立
全文索引是以空格或標點隔開才能搜到的,搜中文是搜不到(有專門的應用支援中文分詞可以搜中文,但都不理想)
少於3個字元的單詞不會被包含在全文索引裡,可以通過修改my.cnf修改選項
ft_min_word_len=3
重新啟動MySQL伺服器,用repair table tablename quick
為有關資料表重新生成全文索引
select * from tablename where match(column1,column2) against('word1 word2 word3')>0.001
match ... against 把column1,column2資料列中至少包含word1,word2,word3三個單詞之一的資料記錄查詢到,在關鍵字match後的資料列必須 跟建立全文索引的資料列相同,檢索詞不區分大小寫和先後順序,少於3個字元的單詞通常被忽略。match... against ...表示式返回一個浮點數作為它本身的求值結果,這個數字反映了結果記錄與被檢索單詞的匹配程度。如果沒有匹配到任何記錄,或者匹配到的結果記錄太多反 而被忽略,表示式將返回0,表示式>0.001的作用是排除match的返回值太小的結果記錄。
select *,match(column1,column2) against ('word1 word2 word3') as mtch from tablename having mtch>0.01 order by mtch desc limit 5
找出最匹配的5條記錄,在where字句中不能使用假名,所以用having
布林全文搜尋的效能支援以下操作符:
+word:一個前導的加號表示該單詞必須 出現在返回的每一行的開頭位置。
-word: 一個前導的減號表示該單詞一定不能出現在任何返回的行中。
(無操作符):在預設狀態下(當沒有指定 + 或–的情況下),該單詞可有可無,但含有該單詞的行等級較高。這和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程式時的運作很類似。
> <這兩個操作符用來改變一個單詞對賦予某一行的相關值的影響。 > 操作符增強其影響,而 <操作符則減弱其影響。請參見下面的例子。
( )括號用來將單詞分成子表示式。括入括號的部分可以被巢狀。
~word:一個前導的代字號用作否定符, 用來否定單詞對該行相關性的影響。 這對於標記“noise(無用資訊)”的單詞很有用。包含這類單詞的行較其它行等級低。
word* :搜尋以word開頭的單詞,只允許出現在單詞的末尾
"word1 word" :給定單詞必須出現在資料記錄中,先後順序也必須匹配,區分字母大小寫
select * from tablename where match(column1,column2) against ('+word1 +word2 -word3' in boolean mode')
布林檢索只能返回1或者0,不再返回表示匹配程度的浮點數
全文索引的缺陷:
1.資料表越大,全文索引效果好,比較小的資料表會返回一些難以理解的結果。
2.全文檢索以整個單詞作為匹配物件,單詞變形(加上字尾,複數形式),就被認為另一個單詞。
3.只有由字母,數字,單引號,下劃線構成的字串被認為是單詞,帶注音符號的字母仍是字母,像C++不再認為是單詞
4.不區分大小寫
5.只能在MyISAM上使用
6.全文索引建立速度慢,而且對有全文索引的各種資料修改操作也慢
7.不支援中文
以上就是MySQL 全文索引的原理與缺陷的詳細內容,更多關於MySQL 全文索引的資料請關注我們其它相關文章!