【问题标题】:solr join multivalue fields query in coressolr 在核心中加入多值字段查询
【发布时间】:2018-08-21 14:14:37
【问题描述】:

我在solr中有两个核心,master和child。

master core 上的一些示例数据是这样的

{master_id:1,child_ids:[123,456]}

子核心上的样本数据就像

[{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"}]

主核心中的child_ids是多值字段,因此名称在主核心中包含“s”。

如何加入这两个核心,我会得到类似的结果

master_id,child_id,name
1,123,"ABC Ltd"
1,456,"xyz ltd"

【问题讨论】:

    标签: solr


    【解决方案1】:

    Solr 中的联接查询解析器不能包含联接双方的字段,但通过使用 Streaming Expression,您可以创建一个从双方返回完整文档的 Stream。

    提供您正在查看的结果的流式表达式可能是:

    hashJoin(
      search(joinahoy, q=child_id:[* TO *], fl="child_id,Name", sort="child_id asc"),  
      hashed=cartesianProduct(
        search(joinahoy, q=master_id:[* TO *], fl="master_id,child_ids", sort="master_id asc"),
        child_ids
      ),
      on="child_id=child_ids"
    )
    

    hashJoin 装饰器接受两个流并返回一个包含两个字段的文档。 hashJoin 会将右侧的完整流(通过hashed 给出)读入内存,然后在将这些值连接到左侧(第一个查询)时查找这些值。

    您也许可以使用 innerJoin 装饰器来代替 cartesianProduct 装饰器上的排序规范,但在试验时我无法让它工作。

    cartesianProduct 装饰器为主文档的多值字段 (child_ids) 中的每个值返回一个文档。

    结果是一组映射到您想要的格式的 JSON 文档:

    {
      "result-set": {
        "docs": [
          {
            "master_id": 1,
            "child_id": 123,
            "child_ids": 123,
            "Name": [
              "ABC Ltd"
            ]
          },
          {
            "master_id": 1,
            "child_id": 456,
            "child_ids": 456,
            "Name": [
              "xyz ltd"
            ]
          },
          {
            "EOF": true,
            "RESPONSE_TIME": 9
          }
        ]
      }
    }
    

    如果您不想同时返回两个子 id 字段,可以将 hashJoin 包装在 select 装饰器中。

    【讨论】:

      【解决方案2】:

      solr 中没有直接连接选项(在 2 个核心之间)。最好的选择是制作一个核心而不是两个。这可以通过在子核心中添加一个额外的字段(master_id)来实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多