Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
solr在核心中连接多值字段查询_Solr - Fatal编程技术网

solr在核心中连接多值字段查询

solr在核心中连接多值字段查询,solr,Solr,我有两个solr核心,master和child 主堆芯上的一些样本数据如下 {master_id:1,child_ids:[123,456]} [{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"}] 子核心上的样本数据如下 {master_id:1,child_ids:[123,456]} [{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"

我有两个solr核心,master和child

主堆芯上的一些样本数据如下

{master_id:1,child_ids:[123,456]}
[{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"}]
子核心上的样本数据如下

{master_id:1,child_ids:[123,456]}
[{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"}]
主核心中的子节点ID是多值字段,因此名称在主核心中包含“s”

如何将这两个核心连接起来,从而得到如下结果

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

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

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
decorator接受两个流,并返回一个包含这两个流中字段的文档。hashJoin会将右侧的完整流(通过
hashed
)读取到内存中,然后在将它们连接到左侧(第一个查询)时查找这些值

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

cartesianProduct
decorator为主文档的多值字段(
child\u id
)中的每个值返回一个文档

结果是一组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
decorator中