簡體   English   中英

倒排索引是如何存儲的?

[英]How are inverted index stored?

我最近做了一個大約的索引。 內存中有 2,000,000 個文檔。 文檔從mysql 數據庫導入,加載需要大約6 到10 秒。 每次我啟動程序時,時間都會消耗在導入數據上。 我曾嘗試使用 json、pickle、cPickle 甚至 redis,但時間很緊迫,為了更新,我必須重新啟動整個程序。 我在這里使用python。

我的問題是像 google、solr、elasticsearch 這樣的搜索引擎如何存儲倒排索引。 他們是將它們作為哈希表存儲在內存中還是存儲在數據庫中? 如何在不重啟的情況下更新索引? 什么可以是用於此類目的的最佳數據庫。

簡答

您不需要在內存中加載所有內容,因為此過程對於大型文檔集合可能特別慢(更糟糕的是,倒排索引甚至可能不適合內存)。

長答案

倒排索引通常存儲在磁盤上,並根據查詢動態加載......例如,如果查詢是“堆棧溢出”,您會點擊與術語“堆棧”和“溢出”相對應的單個列表...

倒排列表的文件結構是固定長度和可變長度組件的混合。 可變長度信息存儲為指針

由於術語(本質上是字符串)的長度可變,因此它們被轉換為整數(4/8 字節的固定長度)。 映射通常作為哈希表存儲在內存中(#terms 通常不是那么大,大約 100K,很容易放入內存)。

給定一個術語,您必須在 in-mem 哈希表中查找它並獲取其id 然后您使用id直接跳轉(隨機訪問偏移)到它在磁盤上的位置。 此位置包含指向包含該術語的文檔列表的指針(此列表是可變長度的),您必須將其加載到內存中。

一旦您加載了所有查詢詞的發布(通常不是很大的數字),您就可以通過遍歷這些列表(通常這些列表按文檔 id 排序)來匯總所有文檔的分數。

上面描述的示意圖: 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM