MySQL全文搜索


 全文索引(fulltext),適用於innodb引擎,字段類型為char,varchar,text。

列:

CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body) );

 

三種類型全文搜索:

1.自然語言(natural language)(默認)(默認不區分大小寫,要區分大小寫,對索引列使用二進制排序規則)

SELECT body FROM articles WHERE MATCH (title,body)  AGAINST ('database' );

 

2.布爾(Boolean)

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

+ 代表 AND  - 代表 NOT   無操作員 ]暗示 OR

InnoDB全文搜索不支持使用帶有通配符('+*'),加號和減號組合('+-')或帶正號和減號組合('+-apple')的前導加號這些無效查詢返回語法錯誤。

InnoDB全文搜索不支持在單個搜索詞上使用多個運算符,如下例所示:'++apple'

InnoDB全文搜索不支持@在布爾全文搜索中使用該符號。@符號保留供@distance 鄰近搜索運算符使用。

 

 

 

3.查詢擴展(query expansion)

搜索“ database ”的用戶 可能實際上意味着 “ MySQL ”“ Oracle ”“ DB2 ”“ RDBMS ”都是應該匹配“ 數據庫 ”的短語 也應該返回。

SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' WITH QUERY EXPANSION);

 

 

全文停用詞(如果一個詞被認為是太普通或者太沒價值,那么它將會被搜索索引和搜索查詢忽略)

SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;

要為所有InnoDB表定義自己的停用詞列表 ,請定義一個與表結構相同的 INNODB_FT_DEFAULT_STOPWORD表,使用停用詞填充它,並 在創建全文索引之前將 innodb_ft_server_stopword_table 選項的值設置為表單中的值 。

CREATE TABLE my_stopwords(value VARCHAR(30));
INSERT INTO my_stopwords(value) VALUES ('Ishmael');
SET GLOBAL innodb_ft_server_stopword_table = 'test/my_stopwords';


默認情況下,長度小於3個字符或長度大於84個字符的單詞不會出現在 InnoDB全文搜索索引中。

 

全文限制

1.分區表不支持全文搜索。

2.雖然支持在單個表中使用多個字符集,但FULLTEXT索引中的所有列都 必須使用相同的字符集和排序規則。

3.'%'字符不是全文搜索支持的通配符

4.對於InnoDB所有DML操作(INSERT, UPDATE, DELETE)與全文索引以事務處理涉及列提交時間。

5.全文搜索可以與大多數多字節字符集一起使用。Unicode, utf8可以使用字符集,但不能使用ucs2字符集

 

全文優化

OPTIMIZE TABLE在具有全文索引的表上 運行會重建全文索引,刪除已刪除的文檔ID並在可能的情況下合並同一個單詞的多個條目。
要優化全文索引,請啟用 innodb_optimize_fulltext_only 並運行OPTIMIZE TABLE。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM