內容概要
- 倒排索引是什麼?為什麼需要倒排索引?
- 倒排索引是怎麼工作的?
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”
- 詞幹分析
通過切斷詞尾將一個詞轉換成詞根形式的過程。
不能處理不規則動詞的情況,但可以處理字典中沒有的詞。
閱讀更多 性能與架構 的文章