1. 程式人生 > 資訊 >AMD AM5 插槽 3D 圖紙曝光:銳龍 7000 系處理器將採用,LGA1718 規格

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 儲存引擎的全文索引。