在Lucene按日期范围过滤

时间:2010-07-15 23:11:10

标签: lucene lucene.net

我知道标题可能表明它是重复但我无法找到这个特定问题的答案:

我必须根据日期范围过滤搜索结果。每个文档的日期都存储(但没有编入索引)。使用过滤器时,我注意到过滤器是使用索引中的所有文档调用的。

这意味着随着索引的增长(当前只有大约300,000个文档),过滤器会变慢,因为它必须遍历每个文档。

我无法使用RangeQuery,因为日期没有编入索引。

如何仅对作为查询结果的文档应用过滤器AFTER以使其更有效?

我喜欢在交付结果之前做到这一点,而不是弄乱我的分数和收藏家。

2 个答案:

答案 0 :(得分:3)

不太确定这是否会有所帮助,但我遇到了类似的问题,并提出以下内容(+注释):

  1. 我认为你真的需要索引日期字段。在查询/过滤等方面没有任何其他意义。
  2. 在Lucene.net v2.9中,与v2.9相比,有很多术语的范围查询似乎非常缓慢
  3. 我通过切换到使用数字字段和数字字段查询来修复使用日期字段时的速度问题。这实际上比我的Lucene.net v2.4基线提高了速度。
  4. 在缓存包装器过滤器中包装您的查询意味着您可以挂起为过滤器设置的文档位。这也将大大加快使用相同过滤器的后续查询。
  5. 过滤器在一组查询结果的评分中不起作用
  6. 将您的缓存过滤器加入到查询的其余部分(我猜您已经获得自定义分数和收集器)意味着它应该符合您标准的最后部分
  7. 因此,总结一下:将日期字段索引为数字字段;将查询构建为数字范围查询;将它们转换为缓存的过滤器包装器并挂在它们上面。

    我认为你会看到一些壮观的加速你当前的索引使用率。

    祝你好运!

    P.S。 我永远不会猜到使用Lucene时会有多快或多慢。我一直对两个方向感到惊讶!

答案 1 :(得分:1)

首先,要对字段进行过滤,必须将其编入索引。

其次,使用过滤器被认为是限制要搜索的文档集的最佳方式。其中一个原因是您可以缓存过滤结果以用于其他查询。过滤器数据结构非常有效:它是与过滤器匹配的一组文档。

但是如果你坚持不使用过滤器,我认为唯一的方法是使用布尔查询来进行过滤。