AMD AM5 插槽 3D 圖紙曝光:銳龍 7000 系處理器將採用,LGA1718 規格
相關配置
- MySQL 5.6 以前的版本,只有 MyISAM 儲存引擎支援全文索引;
- MySQL 5.6 及以後的版本,MyISAM 和 InnoDB 儲存引擎均支援全文索引;
- 只有欄位的資料型別為 char、varchar、text 及其系列才可以建全文索引;
操作全文索引
建立
create table fulltext_test ( id int(11) NOT NULL AUTO_INCREMENT, content text NOT NULL, tag varchar(255), PRIMARY KEY (id), FULLTEXT KEY content_tag_fulltext(content,tag) // 建立聯合全文索引列 ) ENGINE=MyISAM DEFAULT CHARSET=utf8; create fulltext index content_tag_fulltext on fulltext_test(content,tag); alter table fulltext_test add fulltext index content_tag_fulltext(content,tag);
刪除
drop index content_tag_fulltext
on fulltext_test;
alter table fulltext_test
drop index content_tag_fulltext;
使用
和常用的模糊匹配使用 like + % 不同,全文索引有自己的語法格式,使用 match 和 against 關鍵字,比如
select * from fulltext_test
where match(content,tag) against('xxx xxx');
match() 函式中指定的列必須和全文索引中指定的列完全相同,否則就會報錯,無法使用全文索引,這是因為全文索引不會記錄關鍵字來自哪一列。如果想要對某一列使用全文索引,請單獨為該列建立全文索引。
全文索引的兩個變數
MySQL 中的全文索引,有兩個變數,最小搜尋長度和最大搜索長度,對於長度小於最小搜尋長度和大於最大搜索長度的詞語,都不會被索引。通俗點就是說,想對一個詞語使用全文索引搜尋,那麼這個詞語的長度必須在以上兩個變數的區間內。
這兩個的預設值可以使用以下命令檢視
show variables like '%ft%';
可以看到這兩個變數在 MyISAM 和 InnoDB 兩種儲存引擎下的變數名和預設值
// MyISAM ft_min_word_len = 4; ft_max_word_len = 84; // InnoDB innodb_ft_min_token_size = 3; innodb_ft_max_token_size = 84;
可以看到最小搜尋長度 MyISAM 引擎下預設是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只會對長度大於等於 4 或者 3 的詞語建立索引,而剛剛搜尋的只有 aaaa 的長度大於等於 4。
配置最小搜尋長度
全文索引的相關引數都無法進行動態修改,必須通過修改 MySQL 的配置檔案來完成。修改最小搜尋長度的值為 1,首先開啟 MySQL 的配置檔案 /etc/my.cnf,在 [mysqld] 的下面追加以下內容
[mysqld]
innodb_ft_min_token_size = 1
ft_min_word_len = 1
然後重啟 MySQL 伺服器,並修復全文索引。注意,修改完引數以後,一定要修復下索引,不然引數不會生效。
兩種修復方式,可以使用下面的命令修復
repair table test quick;
或者直接刪掉重新建立索引,再次執行上面的查詢,a、aa、aaa 就都可以查出來了。
兩種全文索引
自然語言的全文索引
預設情況下,或者使用 in natural language mode 修飾符時,match() 函式對文字集合執行自然語言搜尋。
自然語言搜尋引擎將計算每一個文件物件和查詢的相關度。這裡,相關度是基於匹配的關鍵詞的個數,以及關鍵詞在文件中出現的次數。在整個索引中出現次數越少的詞語,匹配時的相關度就越高。相反,非常常見的單詞將不會被搜尋,如果一個詞語的在超過 50% 的記錄中都出現了,那麼自然語言的搜尋將不會搜尋這類詞語。上面提到的,測試表中必須有 4 條以上的記錄,就是這個原因。
這個機制也比較好理解,比如說,一個數據表儲存的是一篇篇的文章,文章中的常見詞、語氣詞等等,出現的肯定比較多,搜尋這些詞語就沒什麼意義了,需要搜尋的是那些文章中有特殊意義的詞,這樣才能把文章區分開。
布林全文索引
在布林搜尋中,我們可以在查詢中自定義某個被搜尋的詞語的相關性,當編寫一個布林搜尋查詢時,可以通過一些字首修飾符來定製搜尋。
MySQL 內建的修飾符,上面查詢最小搜尋長度時,搜尋結果 ft_boolean_syntax 變數的值就是內建的修飾符,下面簡單解釋幾個,更多修飾符的作用可以查手冊
+ 必須包含該詞
- 必須不包含該詞
> 提高該詞的相關性,查詢的結果靠前
< 降低該詞的相關性,查詢的結果靠後
(*)星號 萬用字元,只能接在詞後面
對於上面提到的問題,可以使用布林全文索引查詢來解決,使用下面的命令,a、aa、aaa、aaaa 就都被查詢出來了。
select * test where match(content) against('a*' in boolean mode);
總結
MySQL 的全文索引最開始僅支援英語,因為英語的詞與詞之間有空格,使用空格作為分詞的分隔符是很方便的。亞洲文字,比如漢語、日語、漢語等,是沒有空格的,這就造成了一定的限制。不過 MySQL 5.7.6 開始,引入了一個 ngram 全文分析器來解決這個問題,並且對 MyISAM 和 InnoDB 引擎都有效。
事實上,MyISAM 儲存引擎對全文索引的支援有很多的限制,例如表級別鎖對效能的影響、資料檔案的崩潰、崩潰後的恢復等,這使得 MyISAM 的全文索引對於很多的應用場景並不適合。所以,多數情況下的建議是使用別的解決方案,例如 Sphinx、Lucene 等等第三方的外掛,亦或是使用 InnoDB 儲存引擎的全文索引。