Apache Lucene忽略日期范围搜索表达式中的月份和日期

时间:2018-06-06 13:54:56

标签: lucene

我尝试查询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"

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

1 个答案:

答案 0 :(得分: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,然后重新编制索引。