首頁  >  文章  >  資料庫  >  MySQL 全文索引應用簡明教學課程

MySQL 全文索引應用簡明教學課程

黄舟
黄舟原創
2017-02-07 17:08:151207瀏覽

本文從以下幾個面向介紹下MySQL全文索引的基礎知識:

  1. MySQL全文索引的幾個注意事項

  2. 全文索引的語法

  3. 幾個搜尋類型的實例

  4. 全文索引的幾個注意事項


搜尋必須在類型為fulltext的索引列上,match中指定的列必須在fulltext中指定過

  • 只能應用在表引擎為MyIsam類型的表中(MySQL 5.6以後也可以用在Innodb表引擎中了)

  • 僅能再char、varchar、text類型的列上面創建全文索引

  • 像普通索引一樣,可以在定義表時指定,也可以在建立表後添加或修改

  • 對於一個大數量級記錄插入,向沒有索引的表中插入資料後建立索引比向有索引的資料表中插入的過程要快很多

  • 搜尋字串必須是一個常數字串,不能是表的列名

  • 在搜尋記錄的選擇性超過50%的時候,認為沒有匹配(只在自然搜尋中限制)

  • 全文索引搜尋語法

  • MATCH (列名1, 列名2,…) AGAINST (搜尋字串[搜尋修飾符])

其中在match裡面指定的列名1、2等,就是在建立全文索引中指定的列名, 後面的搜尋修飾符說明如下:

search_modifier:
{
IN NATURAL LANGUAGE MODE
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
| IN BOOLEAN MODE
| WITH QUERY EXPANSION
}

幾種搜尋類型的簡介

上面的搜尋修飾符,實際上說明了3種全文搜尋類型


IN NATURAL LANGUAGE MODE

簡介:預設的搜尋形式(不加任何搜尋修飾符或修飾符為IN NATURAL LANGUAGE MODE 的情況)字符都解析為正常的字符,沒有特殊意義

對屏蔽字符列表中的字符串進行過濾


當記錄的選擇性超過50%的時候,通常被認為是不匹配
  1. 回傳記錄依照記錄的相關性進行排序顯示
  2. IN BOOLEAN MODE

會依照一定的規則解析搜尋字串中的特殊字元的意義,進行一些邏輯意義的規則。如:某個單字必須出現,或不能出現等

這種類型的搜尋回傳的記錄是不依照相關性進行排序的


簡介 EXPANSPANSPERPPANS稍微複雜的搜尋形式,實際上是進行了2次自然搜索,可以返回記錄直接簡介性關係的記錄,修飾詞IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 或WITH QUERY EXPANSION modifier
  1. 特徵:這種類型的搜素特徵,實際上提供了一種間接的搜尋功能,例如:我搜尋某個字詞,而且傳回的第一行卻不包含搜尋字詞中的任意字串。可以根據第一次搜尋結果的記錄詞進行第二次匹配,從而可能找到一些間接關係的匹配記錄。

    幾種搜尋類型的實例介紹
  2. IN NATURAL LANGUAGE MODE模式下的應用:

    還是應用在product表,其中在name字段我們建立了全文索引,因為我需要根據關鍵詞在name列中匹配出相關詞記錄
Sql語句如下:

SELECT * FROM product WHERE match(name) against(‘auto’)

時間還不錯,在將近87w的記錄中命中了1w多條,耗時1.15秒,效果還是不錯

注意:在默認的情況下已經是根據相關性從高到低迴傳記錄了我們可以SELECT match(name) against('auto') FROM product 查看記錄的相關性值,值都在0和1之間, 0代表記錄不符

 重要的幾個特性:

1. 哪些詞會被忽略

搜尋詞太短預設全文索引認為4個以上字符的單字是有效詞,我們可以在配置中修改ft_min_word_len進行配置

屏蔽詞表中的詞默認的全文索引將一些常用字屏蔽掉,因為這些字太常見了,沒有任何語意作用,所以搜尋過程中是忽略不計的。當然這個清單也是可以配置的。

2. 如何進行分詞的

全文索引認為一個連續的有效字符(正則中w匹配的字符集)是一個單詞,也可以包含一個“'”, 但是連續的兩個'會被認為是一個分隔符號。其他的分隔符號如:空格、逗號、句點等

IN BOOLEAN MODE 模式下的應用:

在布爾匹配模式中,我們可以添加一些特殊過程的符號,增加一些搜索特殊過程的的邏輯功能。如官方網站中提供的實例(搜尋含有mysql字串 且 不含Yousql的語句):

SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST (‘+MySQL -YourSQL’ IN BOOLEAN MODE);

可见,我们对搜索的控制又多了一些,看起来“高大上”了些。

实际上,上面的操作隐含了几个意思:

  • 加号:相当于and

  • 减号:相当于not

  • 没有:相当于or


下面看下布尔类型搜索的几个重要特性: 


1. 没有50%记录选择性的限制,即使搜索结果记录超过总数的50%也同样返回结果

2. 不会自动的按记录的相关性进行降序排序

3. 可以直接应用在没有创建fulltext的全文索引上,但是这样会查询的非常慢,所以说还是别用了。

4. 支持最小、最大单词长度

5. 应用屏蔽词列表


布尔搜索支持的操作符:

n 加号 +:指示修饰的单词必须出现在记录中

n 减号 -:指示修饰的单词必须不能出现在记录中

n 没有任何操作符:单词可有可无,但是包含该词的记录相关性高

n 双引号 “ : 将一个词组作为一个匹配。如:”one word” 匹配one word在一起的单词


下面是官方的一些实例:

至少包含一个词的记录
‘apple banana’
必须包含着两个词
‘+apple +juice’
必须包含apple,包含macintosh的记录相关性高,也可以不包含
‘+apple macintosh’
必须包含apple且不能喊有macintosh
‘+apple -macintosh’
查找apple开头单词的记录
‘apple*’
完整匹配some words单词
‘”some words”‘

了解了基本的mysql全文索引知识,觉得它的全文索引比like当然是强了很多。但是面对高级的搜索还是略显简陋,且性能问题也是担忧。

以上就是MySQL 全文索引应用简明教程的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:mysql8.0來了下一篇:mysql8.0來了