如何存储倒排索引?

问题描述 投票:0回答:1

我最近制作了一个约内存中有2,000,000个文档。这些文档是从mysql datbase导入的,加载大约需要6到10秒。每次启动程序时,都会在导入数据中花费时间。我已经尝试过使用json,pickle,cPickle甚至redis,但时间是值得关注的,而对于更新,我必须重新启动整个程序。我在这里使用python。

我的问题是,诸如google,solr,elasticsearch之类的搜索引擎如何存储反向索引。他们是否将它们存储在内存中作为哈希表或数据库中?如何在不重新启动的情况下更新索引?为此目的最好的数据库是什么。

python database data-structures information-retrieval inverted-index
1个回答
0
投票

简短回答

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

Long Answer

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

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

由于术语(基本上是字符串)的长度是可变的,因此它们会转换为整数(固定长度为32个字节)。映射通常以哈希表的形式存储在内存中(#terms通常不会大到100K的数量级,很容易放入内存中。)

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

一旦加载了所有查询词(通常不是很大)的帖子,您就可以通过遍历这些列表来汇总所有文档的分数(通常这些列表按文档ID排序)。

© www.soinside.com 2019 - 2024. All rights reserved.