【问题标题】:Apache Lucene ignores months and days in date range search expressionApache Lucene 忽略日期范围搜索表达式中的月份和日期
【发布时间】:2018-06-06 13:54:56
【问题描述】:

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

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

【问题讨论】:

    标签: lucene


    【解决方案1】:

    分析是问题。

    当您编制索引时,您的日期会分成三个词:“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,然后重新索引。

    【讨论】:

    • 将日期格式从 yyyy-MM-dd 更改为 yyyyMMdd 实际上有所帮助 - 我能够按照我的需要精确到一天,但它确实需要重新编制索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多