倒排索引是如何存储的?

3 python database information-retrieval inverted-index data-structures

我最近做了一个大约的索引。内存中有 2,000,000 个文档。这些文档是从 mysql 数据库导入的,加载大约需要 6 到 10 秒。每次启动程序时,时间都消耗在导入数据上。我尝试过使用 json、pickle、cPickle 甚至 redis,但时间很重要,为了更新我必须重新启动整个程序。我这里用的是python。

我的问题是google、solr、elasticsearch等搜索引擎如何存储倒排索引。他们将它们作为哈希表存储在内存中还是数据库中?如何在不重启的情况下更新索引?用于此目的的最佳数据库是什么?

Deb*_*sis 5

简短回答

您不需要将所有内容加载到内存中,因为对于大型文档集合,此过程可能特别慢(更糟糕的是,倒排索引甚至可能无法放入内存中)。

长答案

倒排索引通常存储在磁盘上,并根据查询动态加载...例如,如果查询是“堆栈溢出”,则您会点击与术语“堆栈”和“溢出”相对应的各个列表...

倒排列表的文件结构是固定长度和可变长度组件的混合。可变长度信息存储为指针

由于术语(本质上是字符串)的长度可变,因此它们被转换为整数(4/8 字节的固定长度)。映射通常作为哈希表存储在内存中(#terms 通常不会那么大,约为 100K,很容易适合内存)。

给定一个术语,您必须在内存哈希表中查找它并获取它的id。然后,您可以使用id直接跳转(带偏移量的随机访问)到其在磁盘上的位置。该位置包含一个指向包含该术语的文档列表的指针(该列表是可变长度的),您必须将其加载到内存中。

加载所有查询词的帖子(通常数量不是很大)后,您可以通过浏览这些列表来聚合所有文档的分数(通常这些列表按文档 ID 排序)。

上述描述的示意图: 在此输入图像描述