實戰2000W條資料實現全文檢索
阿新 • • 發佈:2018-12-10
一) 前期準備測試:
-
舊版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的欄位上。
-
不過新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具體資訊要隨時關注官網,下載mySql5.7
-
直接使用,可檢索數字,英文,測時檢索中文失敗
alter table testtable add fulltext index testfulltext(clumn1,clumn2)`
-
解決無法查詢中文,修改配置檔案my.ini [mysqld] ngramtokensize=2
加入全文索引
-
建表同時加入全文檢索
CREATE TABLE articles ( id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT,FULLTEXT (title,body) WITH PARSER ngram ) ENGINE=InnoDB CHARACTER SET utf8mb4;
-
修改方式新增全文檢索
alter table testtable add fulltext index testfulltext(clumn1,clumn2) with parser ngram;
-
新建方式新增全文檢索
CREATE FULLTEXT INDEX ft_email_name ON student(name) with parser ngram;`
-
驗證全文檢索結果
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('關鍵詞' IN NATURAL LANGUAGE MODE);
注意:關鍵字不能太短,小於兩個字無法匹配> 注意:關鍵字不能太短,小於兩個字無法匹配
二) 2000W資料實測:
資料庫已經建好,資料已經插入,總資料量為1980W條資料
-
新增全文檢索:
CREATE FULLTEXT INDEX ft_pat_search ON pat_patent(`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) with parser ngram;
-
查詢:
SELECT * FROM pat_patent WHERE MATCH (`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) AGAINST ('三星' IN NATURAL LANGUAGE MODE);
結果用時183s,耗時太長 分析原因1:索引量過大導致過慢,嘗試縮短檢索欄位(只選用一個欄位)
CREATE FULLTEXT INDEX ft_pat_search_ti ON pat_patent(`ti`) with parser ngram;
結果可明顯提升檢索速率,檢索用時1.3s; 依舊不理想,繼續分析原因,可能是查詢結果資料量過大,傳輸受限,嘗試加入分頁
SELECT * FROM pat_patent WHERE MATCH (`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) AGAINST ('三星' IN NATURAL LANGUAGE MODE) LIMIT 10, 10;
查詢結果0.5s,測試成功
三)總結:
- 版本更新至5.7,注意資料庫路徑選擇在非C盤,負責會在新增全文檢索時報錯ERRO:1878
- 新增檢索式加上 with parser ngram
- 配置檔案加上ngramtokensize=2,可解決搜尋中文問題
- 提高查詢效率,可加入分頁