我们已经设置了一个包含3600万个文档(每个约1K-2K)的Solr索引,我们尝试查询最多100个与单个简单关键字匹配的文档。这很快就像我们希望的那样快。 但是,如果我们现在向查询添加“& sort = createDate + desc”(因此要求匹配查询的前100个'新'文档),它会运行很长很长时间,最终会导致OutOfMemoryException。 根据我从手册中的理解,这是由于Lucene需要在执行查询之前将此字段(createDate)的所有不同值加载到内存(FieldCache afaik)中。由于createDate字段包含日期和时间,因此不同值的数量非常大。 同样重要的是我们经常更新索引。
也许有人可以就如何调整Lucene / Solr或以查询时间变得可接受的方式改变我们的方法提供一些见解和指示? 您的意见将非常感谢!感谢。
答案 0 :(得分:2)
问题是Lucene将数字存储为字符串。有一些实用程序,它们将日期分为YYYY,MM,DD并将它们放在不同的字段中。这会带来更好的结果。
较新版本的Lucene(2.9以上版本)支持数字字段,性能改进很重要(几个数量级,IIRC。)查看有关数字查询的this文章。
答案 1 :(得分:0)
您可以按索引顺序对结果进行排序。 按文档编号递减的排序规范是:
new SortField(null, SortField.DOC, true)
您还应该按日期字段对索引目录进行分区。 收集前N个结果时,Lucene会检查所有匹配的文档。 分区将拆分检查集。如果在最新分区中有N个结果,则无需检查旧分区。
答案 2 :(得分:0)
尝试将日期类型数据转换为字符串类型(例如毫秒)。