python - 倒排索引是如何存储的?

标签 python database data-structures information-retrieval inverted-index

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

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

最佳答案

简答:

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

长答案:

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

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

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

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

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

上面描述的示意图: enter image description here

关于python - 倒排索引是如何存储的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60638084/

相关文章:

python - 为什么 .query() 函数不适用于 Django ORM 查询?

python - lambda 的列表理解返回相同的值

python - Pandas 加入 3 个 dfs

c#使用sql数据库验证登录

c# - C# 中将任意数量的字符串组合成单个字符串的正确方法

c - 运行程序时出现段错误(核心转储)

java - 在给定的数组段中查找最小数

python - 傅立叶变换 Sympy 什么都不做?

python 打开一个包含整数的文件

javascript - (添加 SQL)Sequelize hasMany 与选项关联