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

Elasticsearch-获取所有文档的所有嵌套对象

上官季
2023-03-14

让我们想象一下Elasticsearch索引,其中每个文档代表一个国家。Country具有城市字段,该字段定义为嵌套的。

示例映射(为了本示例的简洁性而简化):

{
  "properties": {
    "name": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword",
          "ignore_above": 256
        }
      } 
    },
    "cities": {
      "type": "nested",
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
        // other properties are omitted for brevity
      }
    }
  }
}

我插入到索引中的文档如下所示:

{
  "name": "Slovakia",
  "cities": [
    {
      "name": "Bratislava"
    },
    {
      "name": "Zilina"
    },
    ...
  ]
}

{
  "name": "Czech Republic",
  "cities": [
    {
      "name": "Praha"
    },
    {
      "name": "Brno"
    },
    ...
  ]
}

是否可以组成一个返回所有城市(所有国家)并支持排序的查询

第一个返回页面(回复)将包含捷克共和国的10个城市,第二个页面将包含10个城市,其中四个(最后一个)来自捷克共和国,六个来自斯洛伐克。

我正在研究复合聚合,但我不知道如何将国家名称添加到来源:

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "nested_aggs": {
      "nested": {
        "path": "cities"
      },
      "aggs": {
        "by_name": {
          "composite": {
            "sources": [
              {
                "cityName": {
                  "terms": {
                    "field": "cities.name.keyword",
                    "order": "asc"
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}

是否可以在不修改Elasticsearch映射的情况下组合这样的查询?

共有1个答案

潘楚
2023-03-14

最简单的选择是首先对国家进行汇总,然后对城市进行汇总:

{
  "size": 0,
  "aggs": {
    "by_country": {
      "terms": {
        "field": "name.keyword",
        "size": 10
      },
      "aggs": {
        "nested_cities": {
          "nested": {
            "path": "cities"
          },
          "aggs": {
            "by_cities": {
              "terms": {
                "field": "cities.name.keyword",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}
{
  "size": 0,
  "aggs": {
    "by_name": {
      "composite": {
        "sources": [
          {
            "countryName": {
              "terms": {
                "field": "name.keyword",
                "order": "asc"
              }
            }
          },
          {
            "cityName": {
              "terms": {
                "field": "cities.name.keyword",
                "order": "asc"
              }
            }
          }
        ]
      }
    }
  }
}

可以很容易地分页。

结果如下:

...
"aggregations" : {
  "by_name" : {
    "after_key" : {
      "countryName" : "Slovakia",
      "cityName" : "Zilina"
    },
    "buckets" : [
      {
        "key" : {
          "countryName" : "Czech Republic",
          "cityName" : "Brno"
        },
        "doc_count" : 1
      },
      {
        "key" : {
          "countryName" : "Czech Republic",
          "cityName" : "Praha"
        },
        "doc_count" : 1
      },
      {
        "key" : {
          "countryName" : "Slovakia",
          "cityName" : "Bratislava"
        },
        "doc_count" : 1
      },
      {
        "key" : {
          "countryName" : "Slovakia",
          "cityName" : "Zilina"
        },
        "doc_count" : 1
      }
    ]
  }
}
 类似资料:
  • null 当然有更好的方法吗?

  • 问题内容: 我想从Elasticsearch集群中的完全匹配查询中获取所有结果。我不在乎结果是否是最新的,我不在乎订单,我只想稳定地浏览所有结果,然后从头开始。滚动和扫描最适合此操作,似乎不需要我拍摄快照就很受欢迎。我将要处理数以千万计的文档。 问题答案: 某种程度上与Elasticsearch查询重复,以返回所有记录。但是我们可以添加更多细节来解决开销问题。(即,“拍摄不需要的快照似乎有点受欢迎

  • 问题内容: 是否可以使elasticsearch中的所有嵌套对象自动映射为默认嵌套的类型。而不是对象? 问题答案: 是的,您可以在创建索引时使用以下动态模板来做到这一点:

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

  • 问题内容: 有什么方法可以创建包含索引的所有数据及其设置和映射的转储文件? 与mongoDB对mongodump进行处理 类似,也与 在Solr中将其数据文件夹复制到备份位置类似。 干杯! 问题答案: Elasticsearch现在开箱即用地支持此功能: https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/modul

  • 我想从一个集合中得到所有的文件,然后用它们,得到他们的身份证。这里我的集合如何是用户集合,它只是一个集合和多个文档。我试了一下,但不起作用: 更新