solr:多值日期范围(表示开放时间)

时间:2011-09-25 20:38:36

标签: architecture lucene solr

考虑一个可能有多个开放时间的小节,具体取决于星期几(+可能关闭的特殊日期)

我希望能够查找当前打开的所有栏,这些栏将在下一个栏中打开,比如说3个小时。 (或者可以问:'从7月18日开始,从7开始到(至少)10)

我认为最好的事情是每个日期都有一个'开放,关闭'元组(欢迎其他建议)

根据我所知,没有一个结合了1个字段中的开/关小时的字段类型,我可以天真(但错误地)使用2个字段来定义这个结构:'open'和'closed',这需要是多值。

现在将它们编入索引:

open: 2011-11-08:1800 - close: 2011-11-09:0300
open: 2011-11-09:1700 - close: 2011-11-10:0500
open: 2011-11-10:1700 - close: 2011-11-11:0300

查询的形式如下:

open < now && close > now+3h

但由于没有办法表明'开放'和'关闭'是成对相关的,我会得到很多误报,例如上面的文件会被退回:

open < 2011-11-09:0100 && close > 2011-11-09:0600

因为某些操作数在2011-11-09:0100之前(即:2011-11-08:1800),而某些封闭式在2011-11-09:0600之后(例如:2011-11-11:0300),但这些开放日期和关闭日期是不是成对相关的。

我一直在考虑使用Solr动态字段的完全不同的方法,其中每个开始和结束日期都获得它自己的动态字段,例如:

  • _date_2011-11-09_open:1800
  • _date_2011-11-09_close:0300
  • _date_2011-11-09_open:1700
  • _date_2011-11-10_close:0500
  • _date_2011-11-10_open:1700
  • _date_2011-11-11_close:0300

然后,客户端应该知道要查询的日期,从而知道要查询的正确字段。这可以解决问题,因为startdate / enddate既不是成对相关的,但我担心从性能角度来看这可能是一个大问题(尤其是Lucene fieldcache的内存消耗)

因此,我没有找到令人满意的解决方案。 任何帮助高度赞赏。

2 个答案:

答案 0 :(得分:2)

在保持像我想要的条形码(而不是BarsxDate)的同时,可以使用expirmental Lucene Spatial Playground实现。

用例+通用解决方案在这里: https://issues.apache.org/jira/browse/SOLR-2155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=comment-13115244#comment-13115244

答案 1 :(得分:0)

首先是一个问题 - 你真的有开放日期吗?一周不是几天?但是把它放在一边(它不会以任何重要的方式改变答案),你应该做的是为每个条形/日期组合创建一个文档。在每个文档中,您将需要您计划搜索的所有字段;也许这包括位置,栏名等。所以这些字段将被非规范化(在许多相关文档中重复)。

通过这种方式,您可以执行您描述的查询并获得精确的结果。