并非所有引擎都支援全文本搜尋。常使用的搜尋引擎包括MyISAM和InnoDB,前者支援全文本搜尋,而後者不支援。
優勢:
使用全文本搜尋時,MySQL不需要分别檢視每個行,不需要分别分析和處理每個詞。MySQL建立指定列中各詞的一個索引,搜尋可以針對這些詞進行。這樣,MySQL可以快速有效決定哪些詞比對,哪些不比對,他們的比對頻率等等。
為了進行全文本搜尋,必須索引被搜尋的列,而且要随着資料的改變不斷地重新索引。在索引之後,select可以與match()和against()一起使用以實際執行搜尋。
啟動全文本搜尋支援
一般在建立愛你表時啟用全文本搜尋。create table 語句接收 full text 子句。
create table productnotes
(
note_id int not null auto_increment,
prod_id char(10) not null,
note_date datetime not null,
note_text text null,
primary key(note_id),
fulltext(note_text)
)ENGINE=MyISAM;
#分析
上述舉例fulltext 索引單個列,如果需要也可以指定多個列。
在定義後,MySQL自動維護該索引,在增加、更新或者删除行時,索引随之自動更新。
可以建立表時指定fulltext,或者再稍後指定(但這種情況下所有已有資料唏噓立即索引)。
不要在導入資料時使用fulltext,應該先導入所有資料,然後再修改表,定義fulltext。這樣有助于更快的導入資料。
進行全文本搜尋
match()—指定被搜尋的列
against()— 指定要使用的搜尋表達式
selectnote_text
from productnotes
where match(note_text) against('rabbit');
分析:針對note_text列進行搜尋,指定rabbit作為搜尋文本
注意
- 使用完成的match()說明:傳遞給match()的值必須與fulltext()定義中的相同。如果指定多列,則必須列出他們并且次序正确。
- 搜尋不區分大小寫 :除非使用BINARY方式,否則全文本搜尋不區分大小寫。
-
使用全文本搜尋傳回以文本比對的良好程度排序的資料(行等級)
等級由根據行中詞的數目、唯一詞的數目、整個索引中詞的總數以及包含該詞的行的資料計算出來
使用查詢擴充
WITH QUERY EXPANSION
用來設法放款所傳回的全文本搜尋結果的範圍,查找出可能相關的結果,即使它們并不精确包含所查找的詞。
使用功能查詢擴充MySQL對資料進行兩遍掃描完成搜尋:
- 首先進行基本的全文搜尋,找出與搜尋條件比對的所有行;
- 其次,MySQL檢查這些比對行并選擇所有有用的詞;
- 最後MySQL再進行全文本搜尋,這次不僅使用原來的條件,而且還使用所有有用的詞;
select note_text
from productnotes
where match(note_text) against('anvils' WITH QUERY EXPANSION);
布爾文本搜尋
IN BOOLEAN MODE
- 要比對的詞;
- 要排斥的詞(如果某行包含這個詞,則不反悔該行,即使它包含了其他指定的詞也是如此);
- 排列提示(指定某些詞比其他詞更重要,更重要的詞等級更高);
- 表達式分組;
- 另外一些内容;
注意
即使沒有定義fulltext索引也可以使用布爾文本搜尋,但這是一種非常緩慢的操作(其性能将随着資料量增加而降低)
select note_text
from productnotes
(1)where match(note_text) against('heavy -rope*' IN BOOLEAN MODE); #有heavy并且排除以rope開始的詞
(2)where match(note_text) against('+rabbit +bait' IN BOOLEAN MODE); #搜尋包含詞rabbit和bait的行
(3)where match(note_text) against('rabbit bait' IN BOOLEAN MODE); #搜尋包含詞rabbit或bait至少一個詞的行;
(4)where match(note_text) against('“rabbit bait”' IN BOOLEAN MODE); #搜尋比對短語rabbit bait,而不是單個詞
(5)where match(note_text) against('>rabbit <carrot' IN BOOLEAN MODE); #搜尋比對rabbit 和 carrot,增加前者等級,降低後者等級
(4)where match(note_text) against('+safe +(comnination)' IN BOOLEAN MODE); #搜尋比對短語safe和combination,降低後者等級