根据lucene索引中的排序顺序存储文档

时间:2011-08-09 08:22:17

标签: java .net lucene

我的索引中有两个字段(name,modifiedDate)。我想基于modifiedDate存储新文档,并保持索引在modifiedDate上排序 doc#1是最早的文档,而(modifiedDate)也是最老的文件 doc #n是最新文档,(modifiedDate)即将发布

1)我如何创建这个基于(modifiedDate)物理存储文档的索引结构,并在索引发生任何更改后保留结构(优化,删除,更新)

2)以下结构让我搜索特定日期范围内的文档。 但我不想搜索整个索引然后过滤。我想使用以下结构跳过所有其他文件,如果它超出日期范围

当前的lucene行为

for(1 to docCount)
 if(modifiedDate在日期范围过滤器中)
根据查询计算得分

接受的行为

for(1 to docCount)
if(modifiedDate大于日期范围的上限)
打破
否则
根据查询计算得分

如果我有3,000,000个文件且我的日期范围只满足20个顶级文档,在当前的lucene行为中我需要检查所有文档,但在接受的行为中我只得到前20个文档,你可以猜到巨大的性能增益

3 个答案:

答案 0 :(得分:1)

现有答案很好,但Lucene 4.3.0今年推出了新的“SortingMergePolicy”,允许高级Lucene用户使用原始海报中建议的算法提前取消搜索。见the javadocs

答案 1 :(得分:0)

Lucene将对数字字段进行有效索引和查询,请参阅NumericRangeQuery。我上面链接的javadoc有关于TrieRangeQuery实现的注释。

您可以将modifiedDate存储为NumericField,其中包含修改日期,以ms为单位。然后在NumericRangeFilter周围使用QueryWrapperFilter将搜索范围限制在适当的日期范围内。

这应该非常有效。

答案 2 :(得分:0)

  1. 您可以使用modifiedDate对结果进行排序,请参阅以下答案:How do I sort Lucene results by field value using a HitCollector?
  2. 如果你真的喜欢冒险,你可以做一些得分定制。 http://lucene.apache.org/java/3_3_0/scoring.html
  3. HTH