我的索引中有两个字段(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个文档,你可以猜到巨大的性能增益
答案 0 :(得分:1)
现有答案很好,但Lucene 4.3.0今年推出了新的“SortingMergePolicy”,允许高级Lucene用户使用原始海报中建议的算法提前取消搜索。见the javadocs
答案 1 :(得分:0)
Lucene将对数字字段进行有效索引和查询,请参阅NumericRangeQuery。我上面链接的javadoc有关于TrieRangeQuery实现的注释。
您可以将modifiedDate存储为NumericField,其中包含修改日期,以ms为单位。然后在NumericRangeFilter周围使用QueryWrapperFilter将搜索范围限制在适当的日期范围内。
这应该非常有效。
答案 2 :(得分:0)
HTH