2010-12-02 71 views
2

我读到,处理日期范围查询NumericRangeQuery比“Lucene在行动”中的TermRangeQuery好,但我找不到原因。我想知道背后的原因。 我用TermRangeQuery和NumericRangequery处理日期范围查询,我发现通过NumericRangeQuery快速搜索。数字范围查询

我的第二点是使用NumericRangeQuery进行查询,我必须使用NumericField创建索引,通过它我可以创建索引达到百万分之一秒,但是如果我想减少我的分辨率到一小时或一天。

回答

3
  • 为什么数字比术语快得多?

正如你所指出的,有一个“精确的步骤”。这意味着数字只存储到一定的精度,这意味着有一个(非常)有限的条款数量。根据文件,在一个指数中超过300个术语是很少见的。如果您对该理论感兴趣,请查看Tries上的维基百科文章。

  • 如何降低精度?

NumericField类在构造函数中有一个“precision”参数。请注意,范围查询也有一个精度参数,并且它们必须相同。该JavaDoc页面链接到一篇关于实现的文章,解释更多精确的含义。

0

@xodarap关于数字字段的说明是正确的。本质上,数字的精度下降以减少实际的术语空间。另外,我想,TermRangeQuery使用字符串比较,而NumericRange查询使用整数。这应该会挤压更多的表现。

您可以以任何所需的分辨率进行索引 - 毫秒到天。 Date.getTime()为您提供自纪元以来的毫秒数。您可以将此数字除以1000,以便在第二次获得分辨率的时间。或者你可以分6万分钟获得分辨率。等等。

+2

请注意,精度参数会影响到这一点。即使你在秒内通过,如果你的精度为4,而你使用的时间很长,它将只存储大约500个不同的值。所以如果你每天有多个价值,两年的每一天,无论你传递的价值有多精确,你都将无法存储超过一天的价值。 – Xodarap 2010-12-02 18:55:58