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

Architecture solr:多值日期范围(表示开放时间),architecture,lucene,solr,Architecture,Lucene,Solr,考虑一个酒吧,它可能有多个开放时间,这取决于一周中的哪一天+它可能关闭的一些特殊日子 我想能够查找所有的酒吧,目前是开放的,这将是未来开放的,比如说,3个小时。或者可以问:“2011年10月18日从7点开到至少10点。” 我认为最好的办法是为每次约会都设置一个“开,关”元组 据我所知,如果没有一个字段类型将打开/关闭时间组合在一个字段中,我可以天真但错误地使用两个字段定义此结构:“打开”和“关闭”,这两个字段需要多值 现在将其索引为: open: 2011-11-08:1800 - close:

考虑一个酒吧,它可能有多个开放时间,这取决于一周中的哪一天+它可能关闭的一些特殊日子

我想能够查找所有的酒吧,目前是开放的,这将是未来开放的,比如说,3个小时。或者可以问:“2011年10月18日从7点开到至少10点。”

我认为最好的办法是为每次约会都设置一个“开,关”元组

据我所知,如果没有一个字段类型将打开/关闭时间组合在一个字段中,我可以天真但错误地使用两个字段定义此结构:“打开”和“关闭”,这两个字段需要多值

现在将其索引为:

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动态字段的一种完全不同的方法,在这种方法中,每个开盘和收盘日期都有自己的动态字段,例如:

_日期:2011-11-09开放时间:1800 _日期:2011-11-09截止日期:0300 _开放时间:1700 _截止日期:2011年11月10日0500 _2011-11-10开放日期:1700 _2011年11月11日截止日期:0300 然后,客户机应该知道要查询的日期,从而知道要查询的正确字段。这将解决问题,因为startdate/enddate不是成对的,但我担心从性能的角度来看,这可能是一个大问题,尤其是Lucene fieldcache的内存消耗

Thusfar,我还没有找到满意的解决方案。
非常感谢您的帮助

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


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

在保持条形图的粒度(如我所希望的)的同时,可以使用Expiremental Lucene Spatial Playde实现

用例+通用解决方案如下:

“你们真的有约会的开放时间吗?”。我认为这是合并特殊日期的最佳方式,这些日期的开放时间通常与“工作日对应时间”不同。至于您的解决方案,我已经想到,在考虑Lucene/Nosql:denormalize!:,时,这通常是我们想到的第一件事,但在走这条路之前,我想知道是否还有其他侵入性更小的方法。每个BarXdate的文档除了需要在我们的客户机上进行索引和搜索更改外,还会占用内存,因为所有排序字段的lucene fieldcache请参阅前面的注释。假设我们有100个约会。这意味着BarXdate文档的nr将为100*条。这感觉非常浪费,因为功能需求相对较小。此外,现在查询总是需要包含一个特定的日期,否则会返回重复的条形图,即:相同的条形图具有不同的日期。最后,我们还有许多其他领域可以进行分类。走这条路会大大增加所需的内存占用,因为每个排序字段的Lucene fieldcache都会增长100倍。当然,谢谢你的想法,但我会走另一条路。如果可能的话,可以定义一个自定义字段类型“daterange”,其中“from”和“to”都是日期。“dateranges”的多值字段将解决此问题。您是否有可能提供一些有关如何实现此功能的详细信息?据我所知,LSP不支持多值字段……我还没有真正实现它,而且我已经有一段时间没有考虑它了。你读过David Smiley对这个用例的回应吗?我注意到上面指向正确评论的热链接不起作用。这个有。Hth:是的,我读过那篇评论,但他似乎不是在说支持多值日期范围。似乎我找到了一篇文章,其中明确地提到了这一点,但我现在似乎找不到它,尽管我可能已经把它与FieldMaskingSpanQuery的建议混淆了,而这个建议本身似乎正在消失,请看:也许我在想他的评论,如果您的查询是一个持续时间,并且您希望它完全驻留在一个索引的持续时间内,那么现在就没有办法了。仅供参考:我在Solr用户列表中再次提出了这个问题:。简而言之:Solr 4开箱即用是可行的!