核心中的solr join多值字段查询

时间:2018-08-06 08:34:43

标签: solr

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

主核上的一些样本数据就像

{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"

2 个答案:

答案 0 :(得分:1)

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

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

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装饰器中。

答案 1 :(得分:0)

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