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

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

黄舟
黄舟原創
2016-12-15 16:18:211188瀏覽

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

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

2.全文索引的語法

3.幾種搜尋類型的簡介

4.幾個搜尋類型的實例


全文索引的幾個注意事項

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

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

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

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

5.對於一個大數量級記錄插入,向沒有索引的表中插入數據後創建索引比向有索引的數據表中插入的過程快很多

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

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


全文索引搜尋語法

MATCH (列名1, 列名2,…) AGAINST (搜索字符串 [搜索修饰符])

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

reee

幾種搜尋類型的簡介

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

IN NATURAL LANGUAGE MODE

簡介:預設的搜尋形式(不加任何搜尋修飾符或修飾符為IN NATURAL LANGUAGE MODE 的情況)

特點:

對於搜尋字串中的字元都解析為正常的字符,沒有特殊意義

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

當記錄的選擇性超過50%的時候,通常被認為是不匹配。

回傳記錄依照記錄的相關性進行排序顯示

IN BOOLEAN MODE

簡介:布林模式搜尋(搜尋修飾符為IN BOOLEAN MODE的情況)

特徵:

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

這種類型的搜索返回的記錄是不按照相關性進行排序的

WITH QUERY EXPANSION

簡介:一種稍微複雜的搜索形式,實際上是進行了2次自然搜索,可以返回記錄直接簡介性關係的記錄,修飾詞IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 或WITH QUERY EXPANSION modifier

特點:這種類型的搜素,實際上提供了一種間接的搜尋功能,例如:我搜尋某個詞,而且返回的第一行中卻不包含搜尋字詞中的任意字串。可以根據第一次搜尋結果的記錄詞進行第二次匹配,從而可能找到一些間接關係的匹配記錄。

幾種搜尋類型的實例介紹

IN NATURAL LANGUAGE MODE模式下的應用:

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

Sql語句如下:

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

   

時間還不錯,在將近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 product WHERE match(name) against(‘auto')

   

可見,我們對搜尋的控制又多了一些,看起來「高大上」了些。

實際上,上面的操作隱含了幾個意思:


加號:相當於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