本文從以下幾個面向介紹下MySQL全文索引的基礎知識:
MySQL全文索引的幾個注意事項
全文索引的語法
幾種搜尋類型的簡介
僅能再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 }
加上任何搜尋修飾符或修飾符為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語句如下:
SELECT * FROM product WHERE match(name) against(‘auto')
注意:在默認的情況下已經是根據相關性從高到低迴傳記錄了
我們可以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);
1. 沒有50%記錄選擇性的限制,即使搜尋結果記錄超過總數的50%也同樣返回結果
2. 不會自動的按記錄的相關性進行降序排序
3. 可以直接應用在沒有創建fulltext的全文索引上,但是這樣會查詢的非常慢,所以說還是別用了。
4. 支援最小、最大單字長度
5. 應用屏蔽詞列表
布爾搜尋支援的操作符:
n 加號+:指示修飾的單字必須出現在記錄中
n 減號-:指示修飾的單字必須不能出現在記錄中
n 沒有任何操作符:單字可有可無,但是包含該字的記錄相關性高
n 雙引號“ : 將一個詞組作為一個匹配。如:”one word” 匹配one word在一起的單字
下面是官方的一些實例:
至少包含一個字的記錄
'apple banana'
必須包含兩個字
'+apple +juice'
必須包含兩個字
'+apple +juice'
必須包含一個macint的記錄相關性高,也可以不包含
'+apple macintosh'
必須包含apple且不能喊有macintosh
'+apple -macintosh'
查找apple開頭單字的記錄
'apple'
'”some words”'
了解了基本的mysql全文索引知識,覺得它的全文索引比like當然是強了很多。擔憂。