2012-04-19 104 views
3

我有一个文件是这样的:
<doc>
<arr name="StartDate">
<date>2012-08-18T17:00:00Z</date>
<date>2012-06-28T17:00:00Z</date>
<date>2013-02-28T17:00:00Z</date>
<date>2012-04-16T17:00:00Z</date>
<date>2012-08-06T17:00:00Z</date>
<date>2012-05-18T17:00:00Z</date>
<date>2012-07-04T17:00:00Z</date>
</arr>
<arr name="EndDate">
<date>2012-09-29T17:00:00Z</date>
<date>2012-06-29T17:00:00Z</date>
<date>2013-04-16T17:00:00Z</date>
<date>2012-05-07T17:00:00Z</date>
<date>2012-08-15T17:00:00Z</date>
<date>2012-06-22T17:00:00Z</date>
<date>2012-08-01T17:00:00Z</date>
</arr>
</doc>
查询多值字段在Solr的

我有日期范围,并希望找到一对起始日期的日期和结束日期覆盖范围。例如,如果输入范围(x,y)为2012-08-18 < x和2012-09-29 > y,则第一对startDate和EndDate(2012-08-18 TO 2012-09-29)返回true。

我写这样的查询:
开始日期:[1995-12-31T23:59:59.999Z TO 2012-08-18T00:00:00.000Z]日期和结束日期:2012-09-29T00:00 :00.000Z TO 2099-01-01T00:00:00.000Z]
但问题是SOLR搜索所有匹配日期中的14个项目的集合,而我只是想逐一比较它们(1与1,2与2 ...)。

请帮助告诉我该怎么做。非常感谢。

回答

2

我有一个类似的模型,但据我所知,还没有任何方法可以在Solr中做到这一点。

Solr中有一个“平”的指标,这意味着如果你的基础机构是这样的:

dates: [ 
    (start1, end1), 
    (start2, end2), 
    (start3, end3) 
] 

将被夷为平地:

start_date: [ start1, start2, start3 ] 
end_date: [ end1, end2, end3 ] 

而且因为是没有关系的每个startend对,所以没有办法对它们进行范围查询。为了直接在Solr中工作,你可能必须实现一个自定义的Solr字段类型来维护这个连接。

另一个解决方案是有一个单独的Solr core与日期字段和主实体的id。这样做的缺点是,您无法将日期搜索与主要实体的其他字段上的过滤功能结合使用。

+0

您的第一个解决方案。我正在考虑使用Solr'函数'查询。只要我们可以迭代2个数组,我们就可以找到实现它的方法。只是我的想法。我对Solr很新。谢谢,等待其他答案。 – dtnam 2012-04-19 08:37:13

+0

我怀疑订单是保证多值字段;我没有阅读源代码来检查这个问题,但它肯定有可能会以'[start2,start1,start3]'结束。 – beerbajay 2012-04-19 08:55:47

+0

我能看到的其他方法是将(start1,end1)非规范化为一个可以搜索的值。然而这可能不是那么容易/可能的,所有 – Fuxi 2012-04-19 11:29:22