ElasticSearch 倒排索引簡析

  • 2020 年 2 月 19 日
  • 筆記

內容概要

  • 倒排索引是什麼?為什麼需要倒排索引?
  • 倒排索引是怎麼工作的?

1. 倒排索引是什麼?

假設有一個交友網站,資訊表如下:

美女1:「我要找在上海做 PHP 的哥哥。

需要匹配 性別、城市、語言列

美女2:「我要找北京的愛旅遊、愛美食的 JAVA 哥哥。

更複雜了是吧,實際場景中,會有更複雜的排列組合。

對於這類的搜索,關係型資料庫的索引就很難應付了,適合使用全文搜索的倒排索引。

倒排索引是一種資料庫的索引形式,存儲了 「內容 -> 文檔」 映射關係,目的是快速的進行全文搜索。

2. 倒排索引是怎麼工作的?

主要包括2個過程:

  • 創建倒排索引
  • 倒排索引搜索

2.1 創建倒排索引

舉個例子,有2個文檔:

  • Document#1

Recipe of pasta with sauce pesto

  • Document#2

Recipe of delicious carbonara pasta

先對文檔進行分詞,形成一個個的 token,也就是 單詞,然後保存這些 token 與文檔的對應關係。

結果如下:

2.2 倒排索引搜索

搜索示例:

  • 搜索 「pasta recipe

先分詞,得到2個 token,( 「pasta」、「recipe」 )。

然後去倒排索引中進行匹配。

這2個詞在2個文檔中都匹配,所以2個文檔都會返回,而且分數相同。

  • 搜索 「carbonara pasta

同樣,2個文檔都匹配,都會返回。

這次 document#2 的分數要比 document#1 高。

因為 #2 匹配了2個詞(「carbonara」、「pasta」),#1 只匹配了一個(「pasta」)。

2.3 轉換

有時我們可以在保存和搜索之前對 token 進行一些轉換,最普遍的例如:

  • 扔掉停止詞

停止詞是那些使用量非常大,但又沒有什麼意義的詞。

例如英文中的 「of」, 「the」, 「for」 ……

  • 元素化

把單詞處理為字典中的標準詞,例如:

「running」 => 「run」

「walks」 => 「walk」

「thought」 =>「think」

  • 詞幹分析

通過切斷詞尾將一個詞轉換成詞根形式的過程。

不能處理不規則動詞的情況,但可以處理字典中沒有的詞。