每周一個算法(1)---倒排索引


倒排索引 inverted index,第一次接觸是在elasticsearch里面,里面的索引就是用的這個,其實es也是使用的Lucene作底層,inverted index是Lucene的核心算法。

網上說,“倒排索引”是實現單詞到文檔映射關系的最佳實現方式。

為什么叫做倒排索引呢?其實我認為中文翻譯的這個名字並不好,(其實感覺編程上面的術語十有八九都沒翻好,這也是阻礙程序員理解學習的重要原因之一,但是大家都這么叫了,你也得跟着這么叫,有的時候真正明白這個概念的時候,你確實覺得中文名字起的太差勁,所以經驗就是:看到一個術語,立即去查英文,和英文文檔),這個“排”字很有誤導性,其實我覺得翻譯成“反向索引”更好。

因為,inverted index的意思是,“使用內容來索引位置”,而不是通常的“使用位置索引內容”。

接下來,說說個人理解:

在Lucene中,對於一篇文檔的處理,首先要Analyze,(對於英文來說)就是把“停用詞”去掉,把大小寫統一,把詞性變化去掉(都還原成最原始的單詞),ES里面也強調這個analyze的過程,並且支持用戶指定analyzer(特定語言使用特定的analyzer)。

然后呢,就是建立索引的過程:

詳細的過程就是這篇博客里寫到的,灰常明白。

http://www.cnblogs.com/fly1988happy/archive/2012/04/01/2429000.html

基本意思就是對於一個詞(關鍵詞(也即上面analyze步驟生成的結果)),要統計出它所在的文章,出現的次數,以及在各個文章中的位置。

這樣就對應生成了詞典文件(Term Dictionary)、頻率文件(frequencies)、位置文件 (positions)

其中詞典文件還記錄了一些附加信息:該關鍵字指向頻率文件和位置文件的指針,及field信息(關鍵字屬於的字段)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM