【问题标题】:Query multivalued field in solr在solr中查询多值字段
【发布时间】:2012-04-19 06:18:20
【问题描述】:

我有这样的文件:
<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 y,则第一对 startDate 和 EndDate (2012-08-18 TO 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...)。

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

【问题讨论】:

    标签: solr full-text-search


    【解决方案1】:

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

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

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

    它将被展平为:

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

    而且由于每个 start 和 end 对之间没有连接,因此无法对它们进行范围查询。为此,要直接在 Solr 中工作,您可能必须实现一个自定义 Solr 字段类型来维护此连接。

    另一种解决方案是有一个单独的Solr core,其中包含您的主要实体的日期字段和id。这样做的缺点是您不能将日期搜索与主要实体的其他字段的过滤结合起来。

    【讨论】:

    • 第一个解决方案。我正在考虑使用 Solr 'function' 查询。只要我们能遍历这2个数组,我们就能找到方法。只是我的想法。我对 Solr 很陌生。谢谢,等待其他答案。
    • 我怀疑多值字段的排序是否得到保证;我还没有阅读源代码来检查这一点,但你肯定有可能最终得到[start2, start1, start3]。
    • 我可以看到的另一种方法是将 (start1, end1) 非规范化为一个可以搜索的值。然而,这可能根本不是那么容易/可能
    • 伏羲。我想你的答案。也许我们可以将 StartDate 和 EndDate 合并到 StartEndDate 2012-08-18T17:00:00Z,2012-09-29T17:00:00Z 并编写如下查询:StartEndDate:[1995-12 -31T23:59:59.999Z 到 GetStartDate()] 和 StartEndDate:GetEndDate() 到 2099-01-01T00:00:00.000Z]。它会起作用吗?如果可能的话,你能帮忙指出如何编写一个函数。谢谢。
    • 只是好奇——这里的最终解决方案是什么?汇总字段是否有效?您如何使用它进行过滤?我有同样的问题,我想缩小可用选项的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多