0

我尝试查询使用包含日期列的数据库表构建的 Apache Lucene 索引,并且我的查询引用了这一列。在 Luke 中,我使用的搜索表达式如下:

column_name:[yyyy-MM-dd TO yyyy-MM-dd]

返回的结果是没有日期(在查询列中)且起始值是年份或更早的记录,以及起始值是年份之后的年份到结束值年份的记录。因此,如果我写 column_name:[2011-05-22 TO 2015-09-03] - 我将获得列中日期为 2012、2013、2014、2015 年的记录。

但是,根据搜索表达式,结果将不准确 - 月份和日期值将被忽略。无论我将设置什么月份和日期 - 搜索都会返回记录,其中包含每个搜索年份(从 01.01 到 31.12)的日期。

如果我使用另一种日期格式,例如:

column_name:[yyyyMMdd TO yyyyMMdd]

我正在寻找可能导致这种情况的原因?这是索引时的日期格式问题吗?或者这是搜索表达式中的日期格式问题?

为了更清楚起见,我应该添加搜索表达式:

column_name:"yyyy-MM-dd"

将按预期返回记录 - 因此表达式中包含日期。

4

1 回答 1

0

分析是问题。

当您编制索引时,您的日期将分为三个术语:“2011”、“05”和“22”。任何一个术语都可以与范围查询匹配,但不能全部匹配三个。因此,对于[2011-05-22 TO 2015-09-03],术语 2011 在字典上并不属于该范围,而 2012、2013、2014 和 2015 都属于该范围。再举一个例子,如果您搜索[1999-01-01 TO 2000-01-01],您还可以找到一个月二十号的所有日期,因为 20 在该词典范围内。

由于该字段只是一个日期,因此您应该避免对其进行标记。使用StringField而不是TextField, 并重新索引。

于 2018-06-06T15:12:24.960 回答