Mysql使用全文索引(FullText?index)的實(shí)例代碼
什么是全文索引
全文索引,通過(guò)建立倒排索引,可以極大的提升檢索效率,解決判斷字段是否包含的問(wèn)題. 例如: 有title字段,需要查詢所有包含 "政府"的記錄. 需要 like "%政府%"方式查詢,查詢速度慢,當(dāng)查詢包含"政府" OR "中國(guó)"的需要是,sql難以簡(jiǎn)單滿足.全文索引就可以實(shí)現(xiàn)這個(gè)功能.
倒排索引(英語(yǔ):Inverted index),也常被稱為反向索引、置入檔案或反向檔案,是一種索引方法,被用來(lái)存儲(chǔ)在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲(chǔ)位置的映射。它是文檔檢索系統(tǒng)中最常用的數(shù)據(jù)結(jié)構(gòu)。
注意
在MySQL 5.6版本以前,只有MyISAM存儲(chǔ)引擎支持全文引擎.在5.6版本中,InnoDB加入了對(duì)全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL內(nèi)置了ngram全文解析器,用來(lái)支持亞洲語(yǔ)種的分詞.
創(chuàng)建全文索引
- 創(chuàng)建表的時(shí)候創(chuàng)建
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR (200), body TEXT, FULLTEXT (title, body) WITH PARSER ngram ) ENGINE = INNODB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';
創(chuàng)建了一個(gè)給title和body字段添加全文縮影的表
- 給字段添加全文索引 ALTER TABLE articles ADD FULLTEXT INDEX title_body_index (title,body) WITH PARSER ngram;
使用全文索引
MySQL的全文索引查詢有多種模式
自然語(yǔ)言搜索
普通的判斷是否包含
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('精神' IN NATURAL LANGUAGE MODE); +----+-----------------+-------------------------+ | id | title | body | +----+-----------------+-------------------------+ | 1 | 弘揚(yáng)正能量 | 貫徹黨的18大精神 | +----+-----------------+-------------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('精神'); +----+-----------------+-------------------------+ | id | title | body | +----+-----------------+-------------------------+ | 1 | 弘揚(yáng)正能量 | 貫徹黨的18大精神 | +----+-----------------+-------------------------+ 1 row in set (0.00 sec) 可以看到,搜索結(jié)果命中了一條,且在不指定搜索模式的情況下,默認(rèn)模式為自然語(yǔ)言搜索.
BOOLEAN MODE
這個(gè)模式和lucene中的BooleanQuery很像,可以通過(guò)一些操作符,來(lái)指定搜索詞在結(jié)果中的包含情況.比如 + 表示必須包含 , -表示必須不包含,默認(rèn)為誤操作符,代表可以出現(xiàn)可以不出現(xiàn),但是出現(xiàn)時(shí)在查詢結(jié)果集中的排名較高一些.也就是該結(jié)果和搜索詞的相關(guān)性高一些.
具體包含的所有操作符可以通過(guò)MySQL查詢來(lái)查看:
show variables like '%ft_boolean_syntax%' +-------------------+----------------+ | Variable_name | Value | +-------------------+----------------+ | ft_boolean_syntax | + -><()~*:""&| | +-------------------+----------------+ mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+精神' IN BOOLEAN MODE); +----+-----------------+-------------------------+ | id | title | body | +----+-----------------+-------------------------+ | 1 | 弘揚(yáng)正能量 | 貫徹黨的18大精神 | +----+-----------------+-------------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+精神 -貫徹' IN BOOLEAN MODE); Empty set (0.01 sec) 當(dāng)搜索必須命中精神時(shí),命中了一條數(shù)據(jù),當(dāng)在加上不能包含貫徹的時(shí)候,無(wú)命中結(jié)果.
強(qiáng)烈注意:MySql自帶的全文索引只能用于數(shù)據(jù)庫(kù)引擎為MYISAM的數(shù)據(jù)表,如果是其他數(shù)據(jù)引擎,則全文索引不會(huì)生效。此外,MySql自帶的全文索引只能對(duì)英文進(jìn)行全文檢索,目前無(wú)法對(duì)中文進(jìn)行全文檢索。如果需要對(duì)包含中文在內(nèi)的文本數(shù)據(jù)進(jìn)行全文檢索,我們需要采用Sphinx(斯芬克斯)/Coreseek技術(shù)來(lái)處理中文。
注:目前,使用MySql自帶的全文索引時(shí),如果查詢字符串的長(zhǎng)度過(guò)短將無(wú)法得到期望的搜索結(jié)果。MySql全文索引所能找到的詞默認(rèn)最小長(zhǎng)度為4個(gè)字符。另外,如果查詢的字符串包含停止詞,那么該停止詞將會(huì)被忽略。
注:如果可能,請(qǐng)盡量先創(chuàng)建表并插入所有數(shù)據(jù)后再創(chuàng)建全文索引,而不要在創(chuàng)建表時(shí)就直接創(chuàng)建全文索引,因?yàn)榍罢弑群笳叩娜乃饕室摺?/p>
總結(jié)
到此這篇關(guān)于Mysql使用全文索引(FullText index)的文章就介紹到這了,更多相關(guān)Mysql使用全文索引內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql模糊查詢like與REGEXP的使用詳細(xì)介紹
每位程序員們應(yīng)該都知道,增刪改查是mysql最基本的功能,而其中查是最頻繁的操作,模糊查找是查詢中非常常見(jiàn)的操作,于是模糊查找成了必修課。下面這篇文章就給大家詳細(xì)介紹了mysql模糊查詢like與REGEXP的使用,有需要的朋友們可以參考學(xué)習(xí)。2016-12-12MySQL使用正則表達(dá)式來(lái)更好地控制數(shù)據(jù)過(guò)濾
MySQL中的正則表達(dá)式是一種強(qiáng)大的數(shù)據(jù)過(guò)濾工具,它允許用戶以靈活的方式匹配和搜索文本數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于MySQL使用正則表達(dá)式來(lái)更好地控制數(shù)據(jù)過(guò)濾的相關(guān)資料,需要的朋友可以參考下2024-08-08MySql增加用戶、授權(quán)、修改密碼等語(yǔ)句
MySql 新建用戶,新建數(shù)據(jù)庫(kù),用戶授權(quán),刪除用戶,修改密碼2008-09-09