MySQL 全文檢索

MySQL 全文檢索支持

MyISAM

從MySQL 4.0以上 myisam引擎就支持了full text search 全文搜索。
那麼怎麼使用了,簡單看看:
1.創建一個表,指定支持fulltext的列

  CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body)
  )ENGINE=MyISAM DEFAULT CHARSET=utf8;

2.插入一些數據作爲測試

  INSERT INTO articles (title,body) VALUES
    ('MySQL Tutorial','DBMS stands for DataBase ...'),
    ('How To Use MySQL Well','After you went through a ...'),
    ('Optimizing MySQL','In this tutorial we will show ...'),
    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    ('MySQL vs. YourSQL','In the following database comparison ...'),
    ('MySQL Security','When configured properly, MySQL ...');

3.select查詢fulltext的列

  SELECT * FROM articles
    WHERE MATCH (title,body) AGAINST ('database');

查詢結果:

  5        MySQL vs. YourSQL        In the following database comparison ...    
  1        MySQL Tutorial               DBMS stands for DataBase ...  

InnoDB

從MySQL 5.6.4以上, InnoDB引擎支持full text search 全文搜索。
使用方法同上,只是建表的時候,引擎設置爲ENGINE=InnoDB即可:

CREATE TABLE t_fulltext (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

全文檢索語法

  MATCH (col1,col2,...) AGAINST (expr [search_modifier])
  search_modifier: { IN BOOLEAN MODE | WITH QUERY EXPANSION }

  例如:SELECT * FROM tab_name WHERE MATCH ('列名1,列名2...列名n') AGAINST('詞1 詞2 詞3 ... 詞m');

  即:MATCH 相當於要匹配的列,而 AGAINST 就是要找的內容。  
  這裏的table需要是MyISAM類型的表,col1、col2 必須是char、varchar或text類型,在查詢之前需要在 col1 和 col2 上分別建立全文索引(FULLTEXT索引)。

檢索方式

 1、自然語言檢索: IN NATURAL LANGUAGE MODE

 2、布爾檢索: IN BOOLEAN MODE
      剔除一半匹配行以上都有的詞,譬如說,每個行都有this這個字的話,那用this去查時,會找不到任何結果,這在記錄條數特別多時很有用,
      原因是數據庫認爲把所有行都找出來是沒有意義的,這時,this幾乎被當作是stopword(中斷詞);但是若只有兩行記錄時,是啥鬼也查不出來的,
      因爲每個字都出現50%(或以上),要避免這種狀況,請用IN BOOLEAN MODE。

   ● IN BOOLEAN MODE的特色: 
      ·不剔除50%以上符合的row。 
      ·不自動以相關性反向排序。 
      ·可以對沒有FULLTEXT index的字段進行搜尋,但會非常慢。 
      ·限制最長與最短的字符串。 
      ·套用Stopwords。

   ● 搜索語法規則:
     +   一定要有(不含有該關鍵詞的數據條均被忽略)。 
     -   不可以有(排除指定關鍵詞,含有該關鍵詞的均被忽略)。 
     >   提高該條匹配數據的權重值。 
     <   降低該條匹配數據的權重值。
     ~   將其相關性由正轉負,表示擁有該字會降低相關性(但不像 - 將之排除),只是排在較後面權重值降低。 
     *   萬用字,不像其他語法放在前面,這個要接在字符串後面。 
     " " 用雙引號將一段句子包起來表示要完全相符,不可拆字。

     SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple -banana' IN BOOLEAN MODE);
     + 表示AND,即必須包含。- 表示NOT,即必須不包含。即:返回記錄必需包含 apple,且不能包含 banner。

     SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('apple banana' IN BOOLEAN MODE);
     apple和banana之間是空格,空格表示OR。即:返回記錄至少包含apple、banana中的一個。

     SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple banana' IN BOOLEAN MODE);
     返回記錄必須包含apple,同時banana可包含也可不包含,若包含的話會獲得更高的權重。

     SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple ~banana' IN BOOLEAN MODE);
     ~ 是我們熟悉的異或運算符。返回記錄必須包含apple,若也包含了banana會降低權重。
     但是它沒有 +apple -banana 嚴格,因爲後者如果包含banana壓根就不返回。

     SELECT * FROM articles WHERE MATCH (title,content) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);
     返回必須同時包含“apple banana”或者必須同時包含“apple orange”的記錄。
     若同時包含“apple banana”和“apple orange”的記錄,則“apple banana”的權重高於“apple orange”的權重。


3、查詢擴展檢索: WITH QUERY EXPANSION

簡單示例

通過IN BOOLEAN MODE指定全文檢索模式爲布爾全文檢索。MySQL還提供了一些類似我們平時使用搜索引擎時用到的的語法:邏輯與、邏輯或、邏輯非等。具體通過幾個SQL語句例子來說明:

1、+ 表示AND,即必須包含。- 表示NOT,即不包含。

SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('+apple -banana' IN BOOLEAN MODE);

2、 apple和banana之間是空格,空格表示OR,即至少包含apple、banana中的一個。

SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('apple banana' IN BOOLEAN MODE);

3、必須包含apple,但是如果同時也包含banana則會獲得更高的權重。

SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('+apple banana' IN BOOLEAN MODE);

4、~ 是我們熟悉的異或運算符。返回的記錄必須包含apple,但是如果同時也包含banana會降低權重。但是它沒有 +apple -banana 嚴格,因爲後者如果包含banana壓根就不返回。

SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('+apple ~banana' IN BOOLEAN MODE);

5、 返回同時包含apple和banana或者同時包含apple和orange的記錄。但是同時包含apple和banana的記錄的權重高於同時包含apple和orange的記錄。

SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);

MySQL全文索引相關配置

MySQL全文檢索時,默認檢索長度爲4,即關鍵詞的長度大於等於4才能被捕獲。

通過以下設置/etc/my.cnf 更改:

ft_min_word_len = 2

ft_min_word_len = 全文檢索的最小許可字符(默認4,通過 SHOW VARIABLES LIKE ‘ft_min_word_len’ 可查看),中文通常是兩個字就是一個詞,所以做中文的話需要修改這個值爲2最好。

注意事項

 1、預設搜尋是不分大小寫,若要分大小寫,columne 的 character set要從utf8改成utf8_bin。

 2、預設 MATCH...AGAINST 是以相關性排序,由高到低。

 3、MATCH(title, content)裏的字段必須和FULLTEXT(title, content)裏的字段一模一樣。
      如果只要單查title或content一個字段,那得另外再建一個 FULLTEXT(title) 或 FULLTEXT(content),也因爲如此,MATCH()的字段一定不能跨table,但是另外兩種搜尋方式好像可以。

 4、MySQL不支持中文全文索引,原因很簡單:與英文不同,中文的文字是連着一起寫的,中間沒有MySQL能找到分詞的地方,截至目前MySQL5.6版本是如此,但是有變通的辦法,就是將整句的中文分詞,並按urlencode、區位碼、base64、拼音等進行編碼使之以“字母+數字”的方式存儲於數據庫中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章