【问题标题】:Query run time in Lucene and index sizeLucene 中的查询运行时间和索引大小
【发布时间】:2015-11-18 11:52:35
【问题描述】:

我听说,在 Lucene 中,每个查询的处理时间和使用的内存几乎不取决于索引的大小。相反,有人告诉我,查询的大小 本身确实决定了运行查询所需的时间和计算资源。我得到的论点归结为这只是因为反向索引是如何工作的

我对 Lucene 不是很熟悉,但是这个断言的确切基础是什么,其中有多少真实性?

【问题讨论】:

    标签: search solr elasticsearch lucene


    【解决方案1】:

    索引和查询都在资源使用中发挥作用。 Lucene 基于文档列表构建反向索引——哪些词在哪些文档中。反向索引将随索引增长(诚然,您可能会发现未验证的边缘情况,但在任何现实生活中的实际情况下都是如此)。

    对于查询,它列出了必须验证才能返回文档的条件 - 再次(一般而言)条件越多,资源使用量就越多。

    所以答案肯定是——索引的大小和查询的大小都会影响资源的使用。

    【讨论】:

      【解决方案2】:

      Lucene 索引全文并存储从terms 到其文档的链接。在搜索terms 时,lucene 搜索索引而不是实际文档。这就是它被称为inverted index 并提供快速响应的原因。

      Lucene 使用不可变列表(数组类型)数据结构来存储术语字典。所有搜索查询都根据术语字典中的信息获取文档。 Lucene 使用 FST 数据结构实现缓存术语字典,本质上是 Trie 数据结构的实现。在 FST 中,lucene 根据词条字典中的前缀和它们的偏移量来存储词条信息。从那里,它执行顺序比较以匹配搜索查询。一旦在术语字典中找到匹配项,它就会提供包含其他信息,例如文档发布列表的频率和偏移量。过帐列表本质上包含实际文档的内存偏移量。

      例如,您正在搜索一个术语:lucene,然后是 FST 的外观以及在术语字典中的顺序搜索。术语词典中的术语已排序。

      Conclusion: Lucene 需要两次磁盘查找来从搜索查询的每个字段中搜索词。第一次查找,从内存中的 FST 到术语字典的偏移量和第二次查找,偏移到发布列表以查找所有匹配的文档偏移量。然后它只需要 1 次磁盘查找来为每个匹配的文档提供服务。

      当索引大小增长到可用内存(缓存)大小时,处理时间和内存使用成为瓶颈。这就是分片概念出现的原因。您将文档分布在许多分片中,这样索引的大小就会很小并且可以缓存在内存中。

      【讨论】:

      • 谢谢,虽然这提供了很多信息,但我不确定它如何回答这个问题。
      • 一开始我谈到了如何在 lucene 中完成搜索。我试图将其与查询时的内存使用和处理时间联系起来。请再检查一次。感谢您的反馈。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 2015-09-21
      • 2014-10-11
      相关资源
      最近更新 更多