1. 程式人生 > >實戰2000W條資料實現全文檢索

實戰2000W條資料實現全文檢索

一) 前期準備測試:

  • 舊版的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

加入全文索引

  1. 建表同時加入全文檢索

     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;
    
  2. 修改方式新增全文檢索

     alter table testtable add fulltext index testfulltext(clumn1,clumn2) with parser ngram;
    
  3. 新建方式新增全文檢索

     CREATE FULLTEXT INDEX ft_email_name ON student(name) with parser ngram;`
    
  4. 驗證全文檢索結果

     SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('關鍵詞' IN NATURAL LANGUAGE MODE);
    

    注意:關鍵字不能太短,小於兩個字無法匹配> 注意:關鍵字不能太短,小於兩個字無法匹配

二) 2000W資料實測:

資料庫已經建好,資料已經插入,總資料量為1980W條資料

  1. 新增全文檢索:

     CREATE FULLTEXT INDEX ft_pat_search ON pat_patent(`aa`,`ad`,`agc`,`an`,`pn`,`in`,`pa`,`ti`,`co`) with parser ngram;
    
  2. 查詢:

     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,可解決搜尋中文問題
  • 提高查詢效率,可加入分頁