2011-05-30 64 views
4

我知道Solr提供了一个可以存储时间实例的日期字段,然后可以执行范围查询以匹配在特定范围内具有该字段的所有文档。solr在时间范围内搜索一段时间

我的问题是与此相反。我需要将多个时间范围与文档相关联,然后在这些范围之一中搜索具有搜索时间的所有文档。

例如,我正在索引网点,并且有3-4个范围,在这个范围内营业厅开放。我需要搜索在特定时间点打开的所有网点。

这样做的一种方式是指数开始时间和持续时间作为单独的日期字段的结束时间和喜欢

(time1_1 > t AND time1_2 < t) OR (time2_1 > t AND time2_2 < t) OR (time3_1 > t AND time3_2 < t)

搜索过程中比较有没有更好/更快/更清洁的方式来做到这一点?

回答

0

您的示例看起来像您的索引的实体是直销商店,并且您将其开始和结束时间存储在单独的(可能是动态的)字段中。

如果您要求采用不同的方法,则必须考虑重新构建现有模式或甚至创建使用其他实体的另一个模式。

起初看起来很不寻常,但如果这个查询是您的应用程序中最重要的一个,那么您应该考虑将您的新索引的实体设置为您想要查询的内容:特定的时间实例。我认为,时间不是一整天,就是一天的一半或四分之一。

该模式将包括诸如ID,一天或半天的开始日期或您选择的任何内容,它的结尾以及指向插座的多值列表(存储在当前索引中)多核设置))。

即使您选择每天处理上午,下午和晚上的时间,甚至预览几年,数据也不应该爆炸。

此不同的架构设置,您可以:

  • 导入过程中做的最重要的计算,使其查询时方便,
  • 返回一重击,你所追求的简单查询

您甚至可以通过使用自定义方式来标识范围来放弃日期字段。我正在考虑从日期和字符串中创建标识符,该字符串指示是早上还是下午等。这将用作SOLR中的唯一ID。如果您可以从查询的任何“时间实例”中创建这样一个ID,您最终将获得简单的ID查找。

例如 早上在2013/03/03开放什么?

/solr的/ openhours /选择Q = ID:2013_03_03_am

回报: 阵列出口的id。