標籤:

搜索系統2:倒排索引

倒排索引可以說是lucene的核心,也就是我介紹的搜索系統的核心。所有數據的存儲都是用的這種結構。例如需要索引的文檔如下:

對於上面的每行文檔的txt欄位,都可能被搜索。那麼lucene是怎麼做的呢?首先使用中文分詞將文檔切成單詞序列(terms),lucene會給每個單詞一個編號

,同時記錄那些文檔包含了這個詞。比如:養生這個詞編號為1,那麼倒排列表為{1,4}。根據中文分詞的不同可能分出來的詞不同,可能最後形成這樣的文件(省略了很多詞):

當然真正的索引文件比這個複雜些,它還會記錄tf(詞頻),idf(文檔頻率),position(單詞位置 )等。

tf:該詞在本文檔中出現了幾次。

idf:該詞在全部文檔中的多個個文檔出現過。

position:該詞在本文檔的那些位置出現過。

關於這幾個值在後面查詢按相關度排序時都會用到。但是在電商行業並不一定會用到,比如tf,不能說商家把作品的名稱里多放幾個"養生",用戶搜"養生"時這個作品就排到最前面吧?所以不能按lucene默認的排序方式來排序,需要定製各行業特有的相關性計算公式。這個後面再聊。

有很多人推薦查看索引的工具luke,個人認為這並不好用,看不出太多有用的信息。

知道了倒排索引,我們再把它與mysql的常用索引結構b-tree與hash相比就知道為什麼資料庫幹不了這活了。這兩索引結構天生就不支持查欄位中的一部分詞,要查就是全部遍歷。當然mysql也可以用全文索引,我沒用過這,但想想應該比較複雜,mysql怎麼支持分詞呢?

好了,在了解了基本結構後,後面再分析查詢會容易得多。

推薦閱讀:

為什麼知乎的搜索功能如此之爛?
Quora,知乎這樣的網站一旦達到一定規模後,有沒有可能取代 Google, Baidu 等搜索引擎?
沒有中立的搜索引擎,但有好的和壞的搜索引擎
pilosa - 搜索引擎新星
有那麼多的網頁和關鍵詞,搜索引擎是怎樣建索引的?

TAG:搜索引擎 |