首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >solr连接核心中的多值字段查询

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

Stack Overflow用户
提问于 2018-08-06 16:34:43
回答 2查看 512关注 0票数 2

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

主核上的一些样本数据如下所示

代码语言:javascript
复制
{master_id:1,child_ids:[123,456]}

子核心上的样本数据如下所示

代码语言:javascript
复制
[{child_id:123,"Name":"ABC Ltd"},{child_id:456,"Name":"xyz ltd"}]

主核中的child_ids是多值字段,因此主核中的name包含"s“。

我怎样才能把这两个核心连接起来,我会得到如下结果

代码语言:javascript
复制
master_id,child_id,name
1,123,"ABC Ltd"
1,456,"xyz ltd"
EN

回答 2

Stack Overflow用户

发布于 2018-08-07 18:54:13

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

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

代码语言:javascript
复制
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提供)读取到内存中,然后在将它们连接到左侧时查找这些值(第一个查询)。

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

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

结果是一组映射到所需格式的JSON文档:

代码语言:javascript
复制
{
  "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
EN

Stack Overflow用户

发布于 2018-08-07 18:34:42

在solr directly.The中没有连接选项(在两个核心之间),最好的选项是创建一个核心而不是两个核心。这可以通过在子核心中添加一个额外的字段(Master_id)来实现。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51703559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档