1. 程式人生 > 資料庫 >MySQL-18全文字搜尋-必知必會

MySQL-18全文字搜尋-必知必會

MyISAM引擎支援全文字搜尋,InnoDB不支援全文字搜尋。

之前學習的萬用字元和正則表示式匹配通常需要MySQL嘗試匹配表中的所有行,非常耗時;很難控制匹配什麼和不匹配什麼;不能提供一種智慧化的選擇結果的方法。

  • 啟動全文字搜尋支援

    CREATE TABLE productnoted
    (
        node_id int         NOT NULL AUTO_INCREMENT,
        prod_id char(10)    NOT NULL,
        note_data datetime  NOT NULL,
        note_text text      NULL,
        PRIMARY KEY(note_id),
        FULLTEXT(note_text)
    )ENGINE=MyISAM;
    

    為了進行全文字搜尋,MySQL根據FULLTEXT(note_text)的指示對它進行索引,在定義之後MySQL自動維護該索引,在增刪改時,索引隨之自動更新。

    可以在建立表時指定FULLTEXT,也可以在之後指定。不要在匯入資料時使用FULLTEXT,先匯入後修改表。

  • 進行全文字搜尋

    在索引之後使用Match()和Against()函式執行全文字搜尋。

    • Match()指定被搜尋的列

    • Against()指定要使用的搜尋表示式

      SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit');
      #此SELECT語句能夠檢索單個列note_text,通過Against函式指定'rabbit'作為搜尋文字,含有該文字的行將被返回/不區分大小寫
      
  • 使用查詢擴充套件

    查詢擴充套件用來設法放寬所返回的全文字搜尋結果的範圍,比如查詢與某個詞有關的其他行。需要對資料和索引進行兩遍掃描

    • 1、進行一個基本的全文字掃描,找出與搜尋條件匹配的所有行
    • 2、檢查這些匹配並選擇所有的詞
    • 3、再次進行全文字搜尋,原來的條件加上步驟2的所有有用的詞
    #下邊例子值返回一行包含詞'rabbit'
    SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit');
    #使用查詢擴充套件,在要查詢的詞後+WITH QUERY EXPANSION
    SELECT note_text FROM productnoted 
    	WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);
    
  • 布林文字搜尋

    支援全文字搜尋的另外一種形式,布林方式,沒有FULLTEXT索引也可以使用,可以提供關於如下內容的細節:

    • 要匹配的詞

      #在note_text列檢索包含詞rabbit的所有行,結果與沒有指定布林操作相同
      SELECT note_text FROM productnoted WHERE Match(note_text) Against('rabbit' IN BOOLEAN MODE);
      #這個搜尋匹配包含詞rebbit和bait的行
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);
      #這個搜尋匹配包含兩個詞至少一個的行
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);
      #這個搜尋匹配短語 rabbit bait
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);
      
      
    • 要排斥的詞

      #匹配包含rabbit但不包含任何以rope開頭的詞的行。
      SELECT note_text FROM productnoted WHERE 
      	Match(note_text) Against('rabbit -rope*' IN BOOLEAN MODE);
      
    • 排列提醒,指定優先順序更高的詞

      #這個搜尋匹配rabbit和bait,增加前者的等級,降低後者的等級
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('>rabbit <bait' IN BOOLEAN MODE);
      #這個搜尋匹配rabbit和bait,降低後者的等級
      SELECT note_text FROM productnoted 
      	WHERE Match(note_text) Against('+rabbit +(<bait)' IN BOOLEAN MODE);
      
    • 表示式分組

    • 另外一些內容