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」
- 詞幹分析
通過切斷詞尾將一個詞轉換成詞根形式的過程。
不能處理不規則動詞的情況,但可以處理字典中沒有的詞。