mysql使用全文索引實現大欄位的模糊查詢
0.場景說明
centos7 mysql5.7 InnoDB引擎
0.1創建表
DROP TABLE IF EXISTS tbl_article_content
;
CREATE TABLE tbl_article_content
(
id
bigint(40) NOT NULL AUTO_INCREMENT,
content
text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
article_id
bigint(40) NOT NULL COMMENT ‘對應文章ID’,
create_by
datetime(0) NOT NULL COMMENT ‘創建時間’,
modifield_by
datetime(0) NOT NULL COMMENT ‘更新時間’,
PRIMARY KEY (id
) USING BTREE,
INDEX artid
(article_id
) USING BTREE,
FULLTEXT INDEX content_word
(content
) WITH PARSER ngram
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
0.2為什麼要使用索引
因為有一個全局搜索的的需求,用戶輸入關鍵字對部落格系統內所有含有該欄位的文章(標題&簡介&內容)進行展示,(上表只是文章內容表),由於要對文章內容進行搜素,而文章內容content在資料庫中是以text存儲的,所以為了查詢效率,這裡就需要使用索引,由於是查大文本,這裡選擇使用全文索引(fulltext).
1.創建索引(使用ngram解析器)
create fulltext index content_word on tbl_article_content(content) WITH PARSER ngram
;
ngram是一個支援中文索引的分詞引擎,
在這裡我們對tbl_article_content表的content欄位建一個叫content_word的全文索引.
2.mysql配置(my.cnf)
mysql默認是沒有開啟與配置ngram的,所以在建立索引後對mysql進行配置
打開mysql配置文件 vim /etc/my.cnf
在[mysqld]下加入
ft_min_word_len=1 //全文索引的最小搜索長度。默認是4
ngram_token_size=1 //分詞的大小設置,這裡設置越小,索引越大
重啟mysql
systemctl restart mysqld
進入mysql,修復一下之前創的索引
repair table tbl_article_content
3.查詢語句
select article_id FROM tbl_article_content WHERE MATCH(content) AGAINST(‘沒有了’);
4.總結問題
從MySQL 5.7開始,MySQL內置了ngram全文檢索插件,用來支援中文分詞,並且對MyISAM和InnoDB引擎有效,使用的時候注意自己版本號和配置
5.相關命令
show create table tbl_article_content; //查詢當前表資訊
SHOW VARIABLES LIKE '%ngram%'; //查詢ngram引擎配置資訊
6.歡迎follow
github: //github.com/DianeDii
wx: dianedii
知乎: 愛睡覺的狄大人 (帶你睡大覺)