首页 > 解决方案 > 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"

标签: solr

解决方案


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

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

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


推荐阅读