如何仅获取嵌套字段内的特定对象以及 Elasticsearch 中的搜索查询

How to fetch only specific object inside nested field along with search query in Elasticsearch

我有一个包含嵌套字段的索引。我只想根据条件以及其他字段在响应中包含特定的嵌套对象。例如考虑映射

    PUT /users
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "address": {
        "type": "nested",
        "properties": {
          "state": {
            "type": "keyword"
          },
          "city": {
            "type": "keyword"
          },
          "country": {
            "type": "keyword"
          }
        }
      }
    }
  }

我想按名称搜索用户,并希望响应仅包含包含国家/地区 = '美国' 的嵌套对象。请考虑用户索引中的以下文档

 {
        "users": [
            {
                "name": "John",
                "address": [
                    {
                        "state": "Alabama",
                        "city": "Alabaster",
                        "Country": "United States"
                    },
                    {
                        "state": "New Delhi",
                        "city": "Agra",
                        "Country": "India"
                    }
                ]
            },
            {
                "name": "Edward John",
                "address": [
                    {
                        "state": "Illinois",
                        "city": "Chicago",
                        "Country": "United States"
                    },
                    {
                        "state": "Afula",
                        "city": "Afula",
                        "Country": "Israel"
                    }
                ]
            },
,
            {
                "name": "Edward John",
                "address": [
                    {
                        "state": "Afula",
                        "city": "Afula",
                        "Country": "Israel"
                    }
                ]
            }
        ]
    }

我期待搜索结果如下

  {
        "users": [
            {
                "name": "John",
                "address": [
                    {
                        "state": "Alabama",
                        "city": "Alabaster",
                        "Country": "United States"
                    }
                ]
            },
            {
                "name": "Edward John",
                "address": [
                    {
                        "state": "Illinois",
                        "city": "Chicago",
                        "Country": "United States"
                    }
                ]
            },
,
            {
                "name": "Edward John",
                "address": [
                ]
            }
        ]
    }

请提供合适的 elasticsearch 查询来获取此文档

尝试使用以下查询

 {
      "query": {
        "nested": {
          "path": "address",
          "query": {
            "bool": {
              "must": [
                {
                  "match": {
                    "address.Country": "United States"
                  }
                }
              ]
            }
          },
          "inner_hits": {}
        }
      }
    }

搜索结果将是

"hits": [
      {
        "_index": "66579117",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.6931471,
        "_source": {
          "name": "John",
          "address": [
            {
              "sate": "Alabama",
              "city": "Alabaster",
              "Country": "United States"
            },
            {
              "sate": "New Delhi",
              "city": "Agra",
              "Country": "India"
            }
          ]
        },
        "inner_hits": {
          "address": {
            "hits": {
              "total": {
                "value": 1,
                "relation": "eq"
              },
              "max_score": 0.6931471,
              "hits": [
                {
                  "_index": "66579117",
                  "_type": "_doc",
                  "_id": "1",
                  "_nested": {
                    "field": "address",
                    "offset": 0
                  },
                  "_score": 0.6931471,
                  "_source": {
                    "sate": "Alabama",
                    "city": "Alabaster",
                    "Country": "United States"
                  }
                }
              ]
            }
          }
        }
      },
      {
        "_index": "66579117",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.6931471,
        "_source": {
          "name": "Edward",
          "address": [
            {
              "sate": "Illinois",
              "city": "Chicago",
              "Country": "United States"
            },
            {
              "sate": "Afula",
              "city": "Afula",
              "Country": "Israel"
            }
          ]
        },
        "inner_hits": {
          "address": {
            "hits": {
              "total": {
                "value": 1,
                "relation": "eq"
              },
              "max_score": 0.6931471,
              "hits": [
                {
                  "_index": "66579117",
                  "_type": "_doc",
                  "_id": "2",
                  "_nested": {
                    "field": "address",
                    "offset": 0
                  },
                  "_score": 0.6931471,
                  "_source": {
                    "sate": "Illinois",
                    "city": "Chicago",
                    "Country": "United States"
                  }
                }
              ]
            }
          }
        }
      }
    ]

正确的查询应该是这个:

POST users/_search
{
  "_source": [
    "name"
  ],
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "address",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "address.Country": "United States"
                    }
                  }
                ]
              }
            },
            "inner_hits": {}
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "nested": {
                  "path": "address",
                  "query": {
                    "bool": {
                      "must": [
                        {
                          "match": {
                            "address.Country": "United States"
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

哪个returns这个:

  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.489748,
    "hits" : [
      {
        "_index" : "users",
        "_type" : "_doc",
        "_id" : "X8pINHgB2VNT6r1rJj04",
        "_score" : 1.489748,
        "_source" : {
          "name" : "John"
        },
        "inner_hits" : {
          "address" : {
            "hits" : {
              "total" : {
                "value" : 1,
                "relation" : "eq"
              },
              "max_score" : 1.489748,
              "hits" : [
                {
                  "_index" : "users",
                  "_type" : "_doc",
                  "_id" : "X8pINHgB2VNT6r1rJj04",
                  "_nested" : {
                    "field" : "address",
                    "offset" : 0
                  },
                  "_score" : 1.489748,
                  "_source" : {
                    "city" : "Alabaster",
                    "Country" : "United States",
                    "state" : "Alabama"
                  }
                }
              ]
            }
          }
        }
      },
      {
        "_index" : "users",
        "_type" : "_doc",
        "_id" : "XftINHgBAEsNDPLQQxL8",
        "_score" : 1.489748,
        "_source" : {
          "name" : "Edward John"
        },
        "inner_hits" : {
          "address" : {
            "hits" : {
              "total" : {
                "value" : 1,
                "relation" : "eq"
              },
              "max_score" : 1.489748,
              "hits" : [
                {
                  "_index" : "users",
                  "_type" : "_doc",
                  "_id" : "XftINHgBAEsNDPLQQxL8",
                  "_nested" : {
                    "field" : "address",
                    "offset" : 0
                  },
                  "_score" : 1.489748,
                  "_source" : {
                    "city" : "Chicago",
                    "Country" : "United States",
                    "state" : "Illinois"
                  }
                }
              ]
            }
          }
        }
      },
      {
        "_index" : "users",
        "_type" : "_doc",
        "_id" : "UoZINHgBNlJvCnAGVzE9",
        "_score" : 0.0,
        "_source" : {
          "name" : "Edward John"
        },
        "inner_hits" : {
          "address" : {
            "hits" : {
              "total" : {
                "value" : 0,
                "relation" : "eq"
              },
              "max_score" : null,
              "hits" : [ ]
            }
          }
        }
      }
    ]
  }