ElasticSearch 倒排索引簡析

ElasticSearch 倒排索引簡析

內容概要

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

1. 倒排索引是什麼?

假設有一個交友網站,信息表如下:

ElasticSearch 倒排索引簡析

美女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 與文檔的對應關係。

結果如下:

ElasticSearch 倒排索引簡析

2.2 倒排索引搜索

搜索示例:

  • 搜索 “pasta recipe”

先分詞,得到2個 token,( “pasta”、“recipe” )。

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

ElasticSearch 倒排索引簡析

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

  • 搜索 “carbonara pasta”
ElasticSearch 倒排索引簡析

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

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

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

2.3 轉換

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

  • 扔掉停止詞

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

例如英文中的 “of”, “the”, “for” ……

  • 元素化

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

“running” => “run”

“walks” => “walk”

“thought” =>“think”

  • 詞幹分析

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

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


分享到:


相關文章: