Lucene索引和搜索问题

时间:2015-12-01 19:22:19

标签: indexing lucene

我在lucene中索引时遇到课程会话开始日期和结束日期的问题。课程可以有多个会话,每个会话可以有一个开始和结束日期。说startdate1-enddate1,startdate2-enddate2 ....

目前,我正在将courseid和会话开始日期和结束日期分别作为lucene中的多值字段编制索引。类似课程:[courseid1] startdate:[startdate1 startdate2 ...],enddate:[enddate1 enddate2 ...]

现在,我的要求是找到所有课程在我通过的时间范围内开始或结束,并且开始日期和结束日期不应为空。此外,startdate和end日期可以为null,我将null date保存为0.

Sessions->

  

session1:20151205开始日期null结束日期
  session2:null开始日期20151202结束日期

在lucene索引中 - >

  

sessionstartdate:0 20151205,sessionenddate:20151202 0

我的lucene查询 - >

sessionstartdate:[20151201 TO 20151210] sessionenddate:[20151201 TO 20151210]

发出─>此查询正在查找课程,但它不应该因为两个会话都有一个空日期。

所以我将查询修改为 -

(sessionstartdate:[20151201 TO 20151210] - sessionenddate:0) (sessionenddate:[20151201 TO 20151210] -sessionstartdate:0)

这不会返回路线,这很好,但现在在以下场景中失败 -

  

session1:20151205开始日期null结束日期
  session2:null开始日期20151202结束日期
  session3:20151201开始日期20151202结束日期

我没有得到任何数据,即使我应该。

1 个答案:

答案 0 :(得分:0)

首先:默认情况下,查询中的每个子句都被视为SHOULD子句。这意味着这些条款中只有一个或多个必须出现在任何比赛中(两者的比赛得分都更高)。为了要求在任何匹配项中出现查询字词,它应该以{{1​​}}开头,因此您的查询应为:

+

现在的问题是,你没有办法匹配session1的开始和结束日期。上述查询将匹配任何一对开始日期和结束日期。因此,您仍然会使用此查询将文档与您的问题中列出的session1和session2进行匹配,正如您所说,这不是您想要的。

处理此问题的最佳方法可能是将会话存储为完全独立的文档,并使用Lucene的Join API来处理关系(顺便说一下,在考虑使用连接时我会问自己的第一个问题在Lucene是“我应该只使用关系数据库吗?”)。