当前位置: 首页 > 知识库问答 >
问题:

如何在Elasticsearch中只获取嵌套字段内的特定对象

董建茗
2023-03-14

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

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

我想按名称搜索用户,并希望响应只包括嵌套对象包含country='U.S.“。请考虑用户索引中的以下文档

 {
        "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查询以获取此文档

共有1个答案

阎英朗
2023-03-14

正确的查询应该是:

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"
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

返回以下内容:

  "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" : [ ]
            }
          }
        }
      }
    ]
  }
 类似资料:
  • 问题内容: 我只想获取嵌套字段,但不能,因为它不是叶字段。 我在下面尝试过,但是无法匹配嵌套对象中的每个ID和名称。 结果: 这是我的预期结果: 问题答案: 如果您没有某个查询应以某种方式匹配嵌套字段,则可以这样进行: 如果您还有一个查询,并且想返回 匹配 的 嵌套文档,则 可以这样操作(使用):

  • 我能够在弹性搜索 6.8 中使用聚合查询获取数据库中文本字段的所有值: 我正在尝试为嵌套字段做同样的事情。 下面是文本字段(城市)和嵌套字段(冷却)的示例 下面是我一直引用的文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations-bucket-terms-aggregation.html

  • 我试图建立一个方面的导航使用elasticsearch为一个电子商务网站。 商店产品可以有多个变体。我想到的文档结构如下所示: 我将变体定义为嵌套类型。这样,以下查询将返回包含匹配筛选器的变体的所有文档: 现在,我真的希望获得与过滤器匹配的变体的id,以便在类别页面上显示该产品的变体。因此,在本例中,我希望返回第二个变量(1_b)的id。我只获取ResultSet中返回的文档的id。有什么方法可以

  • 问题内容: 这是我的文档架构。是嵌套对象。我需要更新/删除其中的特定文件。我能够使用groovy脚本更新字段。 但是不知道如何更新嵌套对象。 例如,我想将此添加到中。 并且我的文档应更改为: 如果我基于= 122 执行删除,则我的记录应如下所示 问题答案: 要将新元素添加到嵌套字段,您可以像这样进行操作: 要从嵌套字段列表中删除现有元素,可以按以下步骤进行:

  • 我正在使用ElasticSearch 7.3来查询一些文档, 我想在查询响应中只返回每个文档的特定字段, 我发现可以使用来实现这一点, 我可以从Kibana使用这个查询来实现这一点- 返回给我正确的数据- 但我无法使用ElasticSearch的节点客户端实现同样的功能- 有人能帮我找到正确的方法来实现我的用例吗? 引用- https://www.elastic.co/guide/en/elast

  • 我只需要在文档中的三个字段中搜索一个术语,并根据搜索术语的位置对结果进行排序。例如,找到3个文档:1个在字段2中有搜索词,2个在字段3中有搜索词,3个在字段1中有搜索词。 我想按顺序看:3、1、2。 我以为我可以用助推来做。现在我使用以下方法: 然而,它似乎是,如果我有一个文档与4个词等于搜索词在字段2和另一个文档与1个词在字段1,比后者将有一个较小的分数。 我看到的一个解决方案是为field1和