在弹性搜索中在一个查询中搜索父级及其所有子级

时间:2018-03-07 08:26:56

标签: elasticsearch elasticsearch-6 aws-elasticsearch

参考建立亲子关系的官方文件中提到的例子 - https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html

该链接提供了问答连接关系,其中问题是父级,答案是子级类型。

如果您需要在一个查询中搜索匹配某些文本的所有父母以及与子项匹配的子项,那么您将如何做到这一点?

让我们说他们在json文档中有键值对,如下所示,我们搜索匹配问题中的文本的父母和匹配答案文本中的值的子项。

Parent --> question --> "question-text" : "Geography: Where is Mt. Everest?"
Child --> answer --> "answer-text" : "Nepal?"

我们不希望父母或仅仅是孩子的结果,而是所有父母及其相关子女与查询相匹配。

我知道内部命中是一种选择,但无法弄清楚用法 - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html

我希望问题很明确,如果需要可以添加更多细节。

我也尝试过这里提到的父子内部命中的例子:

示例:

POST test_index/_search
    {
      "query": {
        "has_child": {
          "type": "child",
          "query": {
            "match": {
              "number": 2
            }
          },
          "inner_hits": {}    
        }
      }
    }

这给了我所有父母的配对孩子。如何向父项添加过滤器并仅查询同一查询中的特定父项(以及子过滤器)?是否可以在同一查询中的特定字段上过滤父记录?

像这样 -

POST test_index/_search
    {
      "query": {
        <match parents first on number:1 and then match the children below>
        "has_child": {
          "type": "child",
          "query": {
            "match": {
              "number": 2
            }
          },
          "inner_hits": {}    
        }
      }
    }

1 个答案:

答案 0 :(得分:1)

这对我有用。唯一的缺点是kibana Discover仪表板不支持has_child或has_parent,因此我们无法构建可视化。

POST test_index/_search
{
    "query": {
        "bool": {
            "must": [{
                "has_child": {
                    "type": "childname",
                    "query": {
                        "match": {
                            "properties.name": "hello"
                        }
                    },
                     "inner_hits": {}    
                }
            },
            {
                "match": {
                    "account.name": "random",
                    "version": {"2.0"}
                }
            },{
                "match": {
                    "account.name": "random",
                    "version": {"2.0"}
                }
            ]
        }
    }
}