MySQL全文本搜索


啟動全文本搜索

CREATE TABLE productnotes
{
    node_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;
  • 這些列中有一個名為note_text的列,為了進行全文本搜索,MySQL根據子句FULLTEXT(note_text)的指示對它進行索引。這里的FULLTEXT索引單個列,如果需要也可以指定多個列。
  • 在定義之后,MySQL自動維護該索引。在增加、更新或刪除行時,索引隨之自動更新。
  • 可以在創建表時指定FULLTEXT,或者在稍后指定(在這種情況下所有已有數據必須立即索引)。

進行全文本搜索

mysql> SELECT note_text 
       FROM productnotes 
       WHERE Match(note_text) Against('rabbi')
+------------------------------------------------------------------------------------------+
| note_text                                                                                |
+------------------------------------------------------------------------------------------+
| Customer complaint: rabbit has been able to detect trap, food apparently less effective now.                             |
| Quantity varies, sold by the sack load.All guaranteed to be bright and orange, and suitable for use as rabbit bait. |
+------------------------------------------------------------------------------------------+
2 rows in set (0.03 sec)
  • Match()指定被搜索的列,Against()指定要使用的搜索表達式。
  • 使用完整的 Match() 說 明 傳遞給 Match() 的值必須與FULLTEXT()定義中的相同。如果指定多個列,則必須列出它們(而且次序正確)。
  • 搜索不區分大小寫 除非使用BINARY方式,否則全文本搜索不區分大小寫。

全文本匹配等級

select note_text,match(note_text) AGAINST('rabbit')AS rank FROM productnotes;
  • Match()和Against()用來建立一個計算列(別名為rank),此列包含全文本搜索計算出的等級值。等級由MySQL根據行中詞的數目、唯一詞的數目、整個索引中詞的總數以及包含該詞的行的數目計算出來。正如所見,不包含詞rabbit的行等級為0(因此不被前一例子中WHERE子句選擇)。確實包含詞rabbit的兩個行每行都有一個等級值,文本中詞靠前的行的等級值比詞靠后的行的等級值高。

  • 排序多個搜索項 如果指定多個搜索項,則包含多數匹配詞的那些行將具有比包含較少詞(或僅有一個匹配)的那些行高的等級值。

使用查詢擴展

SELECT note_text FROM productnotes Match(note_text) Against('anvils' WITH QUERY EXPANSION);

在這里插入圖片描述

  • 這次返回了7行。第一行包含詞anvils,因此等級最高。第二行與anvils無關,但因為它包含第一行中的兩個詞(customer和recommend),所以也被檢索出來。第3行也包含這兩個相同的詞,但它們在文本中的位置更靠后且分開得更遠,因此也包含這一行,但等級為第三。第三行確實也沒有涉及anvils(按它們的產品名)。
  • 正如所見,查詢擴展極大地增加了返回的行數,但這樣做也增加了你實際上並不想要的行的數目。

布爾文本搜索[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ORwwE0Dh-1592563655670)(/home/cmf/.config/Typora/typora-user-images/image-20200619184012720.png)]

  • 然匹配詞heavy,但-rope明確地指示MySQL排除包含rope

全文本布爾操作符

布 爾 操 作 符 說 明
+ 包含,詞必須存在
- 排除,詞必須不出現
> 包含,而且增加等級值
< 包含,且減少等級值
() 把詞組成子表達式(允許這些子表達式作為一個組被包含、排除、排列等)
~ 取消一個詞的排序值
* 詞尾的通配符
"" 定義一個短語(與單個詞的列表不一樣,它匹配整個短語以便包含或排除這個短語)

全文本搜索的使用說明

  • 索引全文本數據時,短詞被忽略且從索引中排除。短詞定義為那些具有3個或3個以下字符的詞(如果需要,這個數目可以更改)。
  • MySQL帶有一個內建的非用詞(stopword)列表,這些詞在索引全文本數據時總是被忽略。如果需要,可以覆蓋這個列表(請參閱MySQL文檔以了解如何完成此工作)。
  • 許多詞出現的頻率很高,搜索它們沒有用處(返回太多的結果)。因此,MySQL規定了一條50%規則,如果一個詞出現在50%以上的行中,則將它作為一個非用詞忽略。50%規則不用於IN BOOLEAN MODE。
  • 如果表中的行數少於3行,則全文本搜索不返回結果(因為每個詞或者不出現,或者至少出現在50%的行中)。
  • 忽略詞中的單引號。例如,don't索引為dont。
  • 不具有詞分隔符(包括日語和漢語)的語言不能恰當地返回全文本搜索結果。
  • 如前所述,僅在MyISAM數據庫引擎中支持全文本搜索。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM