我在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结束日期
我没有得到任何数据,即使我应该。
答案 0 :(得分:0)
首先:默认情况下,查询中的每个子句都被视为SHOULD
子句。这意味着这些条款中只有一个或多个必须出现在任何比赛中(两者的比赛得分都更高)。为了要求在任何匹配项中出现查询字词,它应该以{{1}}开头,因此您的查询应为:
+
现在的问题是,你没有办法匹配session1的开始和结束日期。上述查询将匹配任何一对开始日期和结束日期。因此,您仍然会使用此查询将文档与您的问题中列出的session1和session2进行匹配,正如您所说,这不是您想要的。
处理此问题的最佳方法可能是将会话存储为完全独立的文档,并使用Lucene的Join API来处理关系(顺便说一下,在考虑使用连接时我会问自己的第一个问题在Lucene是“我应该只使用关系数据库吗?”)。