產品級搜尋技術-全文字索引

Destiny發表於2016-08-11

介紹

大部分技術員在處理搜尋問題的時候,往往直接依賴資料庫的查詢功能,通過普通 SQL 語句的數值比較, 範圍的過濾等就可以完成絕大多數我們需要的查詢了, 但是如果你希望通過關鍵字的匹配來進行查詢過濾, 那麼就需要基於相似度的查詢, 而不是原來的精確數值比較, 那麼這種查詢我們第一個想到的肯定是 LIKE 的 SQL 語句, 但是LIKE模糊查詢它的工作原理是全表掃描, 如果資料量非常大, 那麼會造成非常嚴重的卡頓, 也可能出現整個專案崩掉, 而全文索引的設計就是避免這種情況的發生

全文搜尋分類

  1. 自然語言搜尋(預設型別):MySQL 會把搜尋的字串解析成一系列的單詞,然後去搜尋包含的行;
  2. 布林模式搜尋:可以為搜尋的字串里加修飾詞,或者必須是什麼短語,安順序搜尋等
  3. 查詢擴充套件搜尋:這種搜尋分為兩個階段。第一階段,是自然語言搜素。第二階段,則先把原來的搜尋字串,與第一階段的搜尋裡高度匹配的那些行,連線到一起。

全文搜尋的特性

  1. 全文搜尋基於 FullText 索引。在 FullText 索引, 裡只能出現在 CHAR VARCHAR TEXT 這幾種型別裡
  2. 全文搜尋會 忽略那些常見詞:常見詞,指的是至少一半的行裡都出現過,超過 50% 的詞,都為常見詞;
  3. 有些為內建的常用單詞:也叫停用詞,比如:the after other
  4. 比較短的單詞也會被停用

所謂的中文全文索引,就是用一本字典,把一段中文字,拆分為一個個的詞語,這樣來符合 FullText 的單詞定義。然後完全可以把中文看作成英文,進行全文字索引!

建表語句

  1. 建立表,不一定要主鍵索引
    create table apothegm(
     attribution varchar(40),
     phrase  text
    ) engine = myisan;
  2. 增加全文索引
    alert table apothegm
    add fulltext (phrase),
    add fulltext (attribution),
    add fulltext (phrase,attribution);
    個人理解:
    1. 索引分為,單列索引和複合索引。
    2. 每次在進行搜尋的時候,必須要有一個 FullText 索引,而它正好是由查詢命令裡列出的那些欄位組成。
    3. 索引越多,寫入資料越慢,但是索引的方式也就越多,越加便捷。

自然語言索引

  1. 基本 SQL 語句
//應用其第一個 FullText 索引
select * from apothegm where match(phrase) againts('time');
//應用其第三個 FullText 索引
select * from apothegm where match(phrase,attribution) againts('time');
  1. 輸出相關程度 : 自然語言型別的全文搜尋。其輸出是按照相關程度遞減順序排列,相關度是一個非負數的浮點數,其中 0代表毫不相關
select phrase,match(phrase) against('time') as relavance from apothegm

PS:把匹配的結構,當作一個獨立欄位,其中 relavance 為相關程度的意思
  1. 多個詞一起查詢,比如查詢 hard 或者 soft
select * from apothegm where match(phrase) againts('hard soft');

布林模式的全文索引

特點

  1. 50% 一樣的規則:不生效了
  2. 查詢結果不再按照 相關程度排序
  3. 也可以對非 FullText 索引列進行搜尋,只是速度相比,有 FullText 的速度要慢

使用的方式

  1. 基本方式:要在 MATCH 後面加IN BOOLEAN MODE,(不加說明,預設使用自然排序IN NATURAL LANGUAGE MODE

    select * from apothegm where match(phrase) againts('hard' in boolean mode);
  2. 按單詞出現順序檢索,把對應單詞用雙引號引起來;

    select * from apothegm where match(phrase) againts('“bell book and candle”' in boolean mode);
  3. 可以搜尋必須出現,必須不出現,分別用 + 和 -標示:

    select * from apothegm where match(phrase) againts('+bell  -candle' in boolean mode);
  4. 可以用*作為萬用字元, 標示以什麼開頭的。但是還是必須遵守,單詞不能過短的約定。

配置全文搜尋引擎

全文索引的引數是可以配置的,可以通過系統變數的辦法進行修改。

  1. 變數 ft_min_word_lenft_max_word_len 來設定單詞所具有的最小長度,和最大長度。預設最小值與最大值分別為 4 和 84
  2. my.confmysqld 下新增 下面語句,然後重啟。

    ft_min_word_len = 1
  3. 如果是已經建立 FullText 索引表,必須重新建立這些索引關係,但也是可以快速修復。

    repair table tbl_name quick; 
  4. 如果是在此之後新建的 FullText 索引,都可以更新使用這個值。

將來的你一定會感謝現在努力的自己!

相關文章