【问题标题】:Sort by date in Solr/Lucene performance problemsSolr/Lucene 性能问题中按日期排序
【发布时间】:2010-12-21 14:36:05
【问题描述】:

我们已经建立了一个包含 3600 万个文档(每个约 1K-2K)的 Solr 索引,我们尝试查询最多 100 个与单个简单关键字匹配的文档。正如我们所希望的那样,这工作得非常快。 但是,如果我们现在将“&sort=createDate+desc”添加到查询中(从而要求与查询匹配的前 100 个“新”文档),它将运行很长时间,最终导致 OutOfMemoryException。 根据我从手册中了解到的情况,这是由于 Lucene 在执行查询之前需要将此字段(createDate)的所有不同值加载到内存(FieldCache afaik)中。由于 createDate 字段包含日期和时间,因此不同值的数量非常大。 值得一提的是,我们经常更新索引。

也许有人可以就我们如何调整 Lucene / Solr 或改变我们的方法以使查询时间变得可以接受提供一些见解和指导? 您的意见将不胜感激!谢谢。

【问题讨论】:

    标签: lucene solr


    【解决方案1】:

    问题是 Lucene 将数字存储为字符串。有一些实用程序将日期拆分为 YYYY、MM、DD 并将它们放在不同的字段中。这会产生更好的结果。

    较新版本的 Lucene(2.9 及更高版本)支持数字字段,性能提升显着(几个数量级,IIRC。)请查看有关数字查询的 this 文章。

    【讨论】:

    • 感谢您的意见,Sashikant!事实上,升级到 Solr 1.4(它实现了 Lucene 2.9)产生了很大的不同。它对我们来说的主要优点是它维护每个段的 FieldCache,并且不需要在提交未更改的段后重新加载它。
    【解决方案2】:

    您可以改为按索引顺序对结果进行排序。 按文档编号降序的排序规范为:

    new SortField(null, SortField.DOC, true)
    

    您还应该按日期字段对索引目录进行分区。 Lucene 在收集前 N 个结果时会检查所有匹配的文档。 分区将拆分检查集。如果最新分区中有 N 个结果,则无需检查旧分区。

    【讨论】:

      【解决方案3】:

      试着把你的 Date 类型的数据转换成 String 类型(比如毫秒)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-04
        • 2011-11-23
        • 2013-06-03
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        相关资源
        最近更新 更多