在Solr中查询多值字段

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>

我有一个日期范围,想要找到一对 StartDate 和 EndDate,以覆盖该范围。例如,如果输入的范围 (x, y) 为 2012-08-18 < x 和 2012-09-29 > y,则第一对 startDate 和 EndDate(2012-08-18 到 2012-09-29)返回 true。
我写了一个查询:
StartDate:[1995-12-31T23:59:59.999Z TO 2012-08-18T00:00:00.000Z] AND EndDate:[2012-09-29T00:00:00.000Z TO 2099-01-01T00:00:00.000Z]
但问题是 SOLR 搜索上面的 14 个项目中的所有匹配日期,而我只想逐个比较它们(1 与 1,2 与 2...)。
请帮忙告诉我如何做到这一点。非常感谢。
1个回答

2

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

Solr有一个“扁平”索引,这意味着如果您的基本实体看起来像这样:

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

它将被压平为:

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

由于每个startend对之间没有联系,因此无法在它们上执行范围查询。要使其直接在Solr中工作,您可能需要实现自定义Solr字段类型来维护此连接。
另一种解决方案是使用具有日期字段和主实体的id的单独的Solr核心。缺点是您无法将日期搜索与主实体的其他字段过滤器组合使用。

对于您的第一个解决方案。我正在考虑使用Solr的'function'查询。只要我们可以迭代遍历这2个数组,我们就可以找到方法来做到这一点。这是我的想法。我对Solr非常陌生。谢谢,等待其他答案。 - dtnam
我怀疑多值字段的排序是否有保证;我还没有阅读源代码来检查这一点,但你最终可能会得到 [start2, start1, start3] - beerbajay
我能看到的另一种方式是将(start1,end1)非规范化为一个可搜索的值。然而,这可能并不容易/可能。 - Fuxi
福熙。我想到你回答。也许我们可以将StartDate和EndDate合并为StartEndDate <string>2012-08-18T17:00:00Z,2012-09-29T17:00:00Z</string>,并编写一个查询,例如: StartEndDate:[1995-12-31T23: 59:59.999Z TO GetStartDate()] AND StartEndDate:[GetEndDate()TO 2099-01-01T00:00:00.000Z]。这样能行吗?如果可能的话,您能帮忙指出如何编写函数。谢谢。 - dtnam
只是好奇 - 这里的最终解决方案是什么?聚合字段起作用了吗?你如何使用它进行过滤?我有同样的问题,我想缩小可用选项的范围。 - cdonner
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接