深入探討MySQL分詞查詢與全文索引技術(shù)
1. 前言
相信小伙伴們?cè)趯W(xué)習(xí) Spring Cloud 微服務(wù)的過(guò)程中涉及到搜索相關(guān)的,你一定會(huì)想到使用Elasticsearch !沒(méi)錯(cuò) Elasticsearch 很強(qiáng)大,但是對(duì)于一些中小型的項(xiàng)目、網(wǎng)站,簡(jiǎn)單的一些分詞搜索需求,如果使用 Elasticsearch 無(wú)論是硬件成本、開(kāi)發(fā)開(kāi)發(fā)成本都大大增加!
如果中小項(xiàng)目中一些簡(jiǎn)單的分詞搜索,可以試試 MySQL 分詞查詢,本章節(jié)跟著博主深入探討 MySQL 的分詞查詢技術(shù),從基礎(chǔ)使用到中文處理全面解析。
2. MySQL 全文索引原理
MySQL 自 5.6 起提供了全文索引(Full?Text Index)功能,通過(guò)分詞(Tokenization)機(jī)制將一段文本拆分成一個(gè)個(gè)“詞元”(token),并建立倒排索引,從而實(shí)現(xiàn)高效的分詞查詢
1、分詞(Tokenization)
將待索引文本(通常是 TEXT 或 VARCHAR)拆分為一個(gè)個(gè)詞元。例如,英文文本會(huì)按空格與標(biāo)點(diǎn)分詞;中文文本默認(rèn)按字符切割,但可配置 ngram 分詞。
2、倒排索引(Inverted Index)
對(duì)每個(gè)詞元,記錄它所出現(xiàn)的所有行號(hào)(文檔 ID),并統(tǒng)計(jì)詞元出現(xiàn)頻次。查詢時(shí),將搜索詞同樣分詞后,快速在倒排索引中定位相關(guān)文檔。
3、相關(guān)性計(jì)算
MySQL 根據(jù)詞元在文檔中出現(xiàn)的頻次(Term Frequency)、在整個(gè)表中出現(xiàn)的文檔數(shù)(Document Frequency)等,使用類似 TF?IDF 的算法計(jì)算相關(guān)度,從高到低排序返回。
3. 配置全文索引與分詞查詢
下面我們以一個(gè)articles表,字段 articles_id 、title、content 為例子來(lái)進(jìn)行操作,以下是建表語(yǔ)句和測(cè)試數(shù)據(jù)
CREATE TABLE `articles` ( `articles_id` int NOT NULL AUTO_INCREMENT COMMENT '文章ID', `title` varchar(255) DEFAULT NULL COMMENT '文章標(biāo)題', `content` text COMMENT '文章內(nèi)容', PRIMARY KEY (`articles_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO `articles` (`articles_id`, `title`, `content`) VALUES (1, '分詞MySQL查詢', '跟麥可樂(lè)學(xué)編程:MySQL分詞查詢'); INSERT INTO `articles` (`articles_id`, `title`, `content`) VALUES (2, 'MySQL分詞', '跟麥可樂(lè)學(xué):MySQL分詞');
3.1 建表與索引
對(duì)Mysql熟悉的小伙伴,可以直接使用SQL進(jìn)行設(shè)置
ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title, content) WITH PARSER ngram; -- 中文需指定ngram解析器
喜歡圖形化操作的小伙伴可按下圖設(shè)置

3.2 基本查詢語(yǔ)法
自然語(yǔ)言模式(Natural Language Mode)
SELECT articles_id, title, content,
MATCH(title, content) AGAINST('分詞 查詢') AS score
FROM articles
WHERE MATCH(title, content)
AGAINST('分詞 查詢');
默認(rèn)按自然語(yǔ)言解析查詢?cè)~,忽略停用詞、極短詞和頻繁出現(xiàn)詞
查詢輸出效果

布爾模式(Boolean Mode)
SELECT articles_id, title, content FROM articles
WHERE MATCH(title,content)
AGAINST('+分詞 -查詢' IN BOOLEAN MODE);
查詢輸出效果

3.3 關(guān)鍵操作符
通過(guò)布爾模式查詢上圖的效果,下面介紹一下布爾模式支持邏輯運(yùn)算符:
| 操作符 | 作用 | 示例 |
|---|---|---|
| + | 必須包含 | +apple +juice |
| - | 必須排除 | apple -macbook |
| ~ | 相關(guān)性降級(jí) | ~fruit ~vegetable |
| * | 通配符 | data* (匹配database等) |
| "" | 短語(yǔ)搜索 | "high performance" |
小伙伴們通過(guò)上述操作符,就可以自由定制自己的分詞查詢規(guī)則
4. 中文分詞 ngram 與插件方案
4.1 ngram 分詞
MySQL 自帶的 ngram 插件可實(shí)現(xiàn)中文近似分詞:
-- 修改my.cnf(建議token長(zhǎng)度2) [mysqld] ngram_token_size=2 -- 建表時(shí)指定分詞器 如: CREATE TABLE chinese_news ( id INT PRIMARY KEY, content TEXT, FULLTEXT INDEX (content) WITH PARSER ngram );
配置了 ngram_token_size=2 中文分詞原理,按兩字切分,例如
原始文本:"分詞查詢"
分詞結(jié)果:["分詞","詞查","查詢"]
4.2 第三方分詞插件
Mecab、jieba 插件:將分詞邏輯交給外部庫(kù),實(shí)現(xiàn)更精準(zhǔn)的中文分詞。
這里博主就不做過(guò)多介紹了,可以根據(jù)插件文檔進(jìn)行安裝即可
5. 進(jìn)階優(yōu)化與監(jiān)控
1.查詢性能監(jiān)控
- 使用
EXPLAIN查看FULLTEXT查詢是否走全文索引。 - 利用慢查詢?nèi)罩竞Y選耗時(shí)的全文檢索。
2.分片與分表
對(duì)于超大文本表,可按日期或業(yè)務(wù)維度分表分區(qū),保證索引文件大小可控。
3.增量索引
InnoDB 支持后臺(tái)算法自動(dòng)增量更新全文索引,無(wú)需手動(dòng)重建整個(gè)索引。
4.權(quán)重調(diào)優(yōu)
MATCH() AGAINST() 可對(duì)多列設(shè)置權(quán)重:
MATCH(title) AGAINST('分詞') * 2 +
MATCH(content) AGAINST('分詞') AS relevance
6. 結(jié)語(yǔ)
MySQL分詞查詢?yōu)槿乃阉魈峁┝烁咝У膬?nèi)置解決方案。通過(guò)合理配置分詞參數(shù)、選擇合適的分詞器(如 ngram 或第三方插件),并運(yùn)用自然語(yǔ)言模式與布爾模式,小伙伴們可以輕松滿足大多數(shù)中小項(xiàng)目中的搜索場(chǎng)景的需求。對(duì)于更復(fù)雜的需求,建議結(jié)合專業(yè)搜索引擎如Elasticsearch構(gòu)建搜索體系。
到此這篇關(guān)于深入探討MySQL分詞查詢與全文索引技術(shù)的文章就介紹到這了,更多相關(guān)MySQL分詞查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫(kù)的導(dǎo)入導(dǎo)出方式(各種情況)
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)的導(dǎo)入導(dǎo)出方式(各種情況),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
MySQL?中MATCH?全文搜索關(guān)鍵字示例詳解
這篇文章主要介紹了MySQL?中MATCH?全文搜索關(guān)鍵字詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-09-09
MySQL order by性能優(yōu)化方法實(shí)例
這篇文章主要介紹了MySQL order by性能優(yōu)化方法實(shí)例,本文講解了MySQL中order by的原理和優(yōu)化order by的三種方法,需要的朋友可以參考下2015-05-05
MySQL之同表一個(gè)字段如何賦值給另一個(gè)字段
這篇文章主要介紹了MySQL之同表一個(gè)字段如何賦值給另一個(gè)字段問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Mysql8導(dǎo)入數(shù)據(jù)到Mysql5.7的實(shí)現(xiàn)步驟
Mysql8的默認(rèn)字符集為utf8mb4,當(dāng)我們有需求要把Mysql8的數(shù)據(jù)導(dǎo)入到Mysql5.7時(shí),就會(huì)出現(xiàn)不支持,本文主要介紹了2種解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03
InnoDB中不同SQL語(yǔ)句設(shè)置鎖的情況詳解
這篇文章主要介紹了InnoDB中不同SQL語(yǔ)句設(shè)置鎖的情況詳解,在Mysql中,鎖定讀、更新、刪除操作通常會(huì)對(duì)SQL語(yǔ)句處理過(guò)程中掃描到的每條索引記錄設(shè)置記錄鎖,需要的朋友可以參考下2024-01-01
mysql動(dòng)態(tài)游標(biāo)學(xué)習(xí)(mysql存儲(chǔ)過(guò)程游標(biāo))
mysql動(dòng)態(tài)游標(biāo)示例,通過(guò)準(zhǔn)備語(yǔ)句、視圖和靜態(tài)游標(biāo)實(shí)現(xiàn),大家參考使用吧2013-12-12
Windows下mysql 8.0.12 安裝詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了Windows下mysql 8.0.12 安裝詳細(xì)教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

