Python 反向索引是如何存储的?

Python 反向索引是如何存储的?,python,database,data-structures,information-retrieval,inverted-index,Python,Database,Data Structures,Information Retrieval,Inverted Index,我最近对内存中的大约2000000个文档进行了索引。这些文档是从mysql数据库导入的,加载大约需要6到10秒。每次启动程序时,导入数据都会消耗时间。我已经尝试过使用json、pickle、cPickle甚至redis,但时间很重要,为了更新,我必须重新启动整个程序。我在这里使用python 我的问题是,像google、solr、elasticsearch这样的搜索引擎是如何存储反向索引的。它们是作为哈希表存储在内存中还是存储在数据库中?如何在不重新启动的情况下更新索引?什么是最好的数据库用于此

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


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

简短回答

您不需要在内存中加载所有内容,因为对于大型文档集合,此过程可能特别慢(更糟糕的是,反向索引甚至可能不适合内存)

长答案

反转索引通常存储在磁盘上,并根据查询动态加载。。。e、 如果查询是“堆栈溢出”,则点击与术语“堆栈”和“溢出”对应的单个列表

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

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

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

加载所有查询项(通常不是很大的数字)的日志后,可以通过遍历这些列表(通常这些列表按文档ID排序)来聚合所有文档的分数

上述说明的示意图:
简短回答

您不需要在内存中加载所有内容,因为对于大型文档集合,此过程可能特别慢(更糟糕的是,反向索引甚至可能不适合内存)

长答案

反转索引通常存储在磁盘上,并根据查询动态加载。。。e、 如果查询是“堆栈溢出”,则点击与术语“堆栈”和“溢出”对应的单个列表

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

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

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

加载所有查询项(通常不是很大的数字)的日志后,可以通过遍历这些列表(通常这些列表按文档ID排序)来聚合所有文档的分数

上述说明的示意图:

这些文档是从mysql数据库导入的。那么,为什么要在内存中构建索引,而可以直接使用mysql索引呢?@Serge我正在从mysql导入一些测试数据集。我在这里的真正目标是开发使用刮取数据的搜索功能。这些文档是从mysql数据库导入的。那么,为什么要在内存中构建索引,而可以直接使用mysql索引呢?@Serge我正在从mysql导入一些测试数据集。我在这里的真正目标是开发使用刮取数据的搜索功能?和短语一样,它可以是2-7个单词的组合。这不符合记忆。那么我该如何将它们存储在文件中呢?我在斯坦福NLP上也是这样读的。谢谢我认为它可以使用pythonmap函数实现。你能为我提供一些开源的东西吗。这将是非常有用的。短语(或一般单词n-grams)可以通过在索引中存储术语的位置来处理。。。您不需要存储高阶n-gram本身。。。e、 g.如果你想搜索短语“纽约”,那么你将点击“纽约”和“纽约”的帖子,只过滤出匹配位置(同一文档)相差1的文档。。。这称为位置索引(),实际上我使用python在系统上实现了位置索引。下一个单词的位置大于上一个单词的位置。越接近的单词排名越高。这是一个很好的技术。如果术语列表远远超过10万个?和短语一样,它可以是2-7个单词的组合。这不符合记忆。那么我该如何将它们存储在文件中呢?我在斯坦福NLP上也是这样读的。谢谢我认为它可以使用pythonmap函数实现。你能为我提供一些开源的东西吗。这将是非常有用的。短语(或一般单词n-grams)可以通过在索引中存储术语的位置来处理。。。您不需要存储高阶n-gram本身。。。e、 g.如果你想搜索短语“纽约”,那么你将点击“纽约”和“纽约”的帖子,只过滤出匹配位置(同一文档)相差1的文档。。。这称为位置索引(),实际上我在