【问题标题】:How are inverted index stored?倒排索引是如何存储的?
【发布时间】:2020-06-23 13:23:56
【问题描述】:

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

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

【问题讨论】:

  • 文件是从mysql数据库导入的。那为什么要在内存中建索引,而直接用mysql索引呢?
  • @Serge 我正在从 mysql 导入一些测试数据集。我的真正目标是利用抓取的数据开发搜索功能。

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


【解决方案1】:

简答

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

长答案

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

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

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

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

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

上述说明的示意图:

【讨论】:

  • 如果术语列表远远超过 100k?就像短语一样,它可以是 2-7 个单词的组合。它不适合记忆。那么我如何将它们存储在文件中?
  • 我在斯坦福 NLP 上也读到过这样的文章。谢谢。我认为它可以使用 python mmap 函数来实现。你能为我提供一些开源的东西吗?这将非常有帮助。
  • 可以通过在索引中存储术语的位置来处理短语(或一般单词 n-gram)...您不需要存储更高阶的 n-gram 本身...例如如果您想搜索短语“New York”,那么您将点击“New”和“York”的帖子,并且只过滤掉匹配位置(对于同一文档)相差 1 的那些文档......这是称为位置索引 (stackoverflow.com/questions/6178083/…)
  • 实际上我使用 python 在我的系统上实现了一个位置索引。下一个单词的位置大于前一个单词。更接近的词获得更高的排名。这是一个很好的技术。
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多