天天看點

全文本搜尋

并非所有引擎都支援全文本搜尋。常使用的搜尋引擎包括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,降低後者等級


           

繼續閱讀