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

如何使用elasticsearch获取嵌套字段的所有值?

袁卓
2023-03-14

我能够在弹性搜索 6.8 中使用聚合查询获取数据库中文本字段的所有值:

{
  aggs: {
    values: {
      terms: { field: 'City.keyword', size: 200 },
    },
  },
  size: 0,
};

我正在尝试为嵌套字段做同样的事情。

下面是文本字段(城市)和嵌套字段(冷却)的示例

"City": "Fredericksburg",
"Cooling": [
    {
        "key": "Fuel",
        "value": "Electric"
    },
    {
        "key": "Central Air",
        "value": "Y"
    },
    {
        "key": "Central A/C",
        "value": "true"
    }
],

下面是我一直引用的文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations-bucket-terms-aggregation.html

这是相关的映射:

{
  "listings:366": {
    "mappings": {
      "_default_": {
        "_all": {
          "enabled": false
        },
        "dynamic_templates": [
          ...
          {
            "Cooling": {
              "path_match": "Cooling.*",
              "mapping": {
                "type": "text"
              }
            }
          },
          ...
        ],
        "properties": {
          ...
          "Cooling": {
            "type": "nested"
          },
          ...
        }
      },
      "listings": {
        "_all": {
          "enabled": false
        },
        "dynamic_templates": [
          ...
          {
            "Cooling": {
              "path_match": "Cooling.*",
              "mapping": {
                "type": "text"
              }
            }
          },
          ...
        ],
        "properties": {
          ...
          "Cooling": {
            "type": "nested",
            "properties": {
              "key": {
                "type": "text"
              },
              "value": {
                "type": "text"
              }
            }
          },
        }
      }
    }
  }
}

共有2个答案

公良玺
2023-03-14

尝试使用复合聚合:请参阅复合聚合

双弘益
2023-03-14

如果冷却嵌套类型,那么您可以通过首先将术语聚合嵌套在顶级嵌套聚合中以“深入”冷却嵌套文档来实现您想要的:

{
  "size": 0,
  "aggs": {
    "cooling": {
      "nested": {
        "path": " Cooling"
      },
      "aggs": {
        "values": {
          "terms": {
            "field": "Cooling.key",  <--- make sure this field is mapped as keyword
            "size": 200
          }
        }
      }
    }
  }
}

更新

您的映射需要更改为:

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

  • 让我们想象一下Elasticsearch索引,其中每个文档代表一个国家。Country具有城市字段,该字段定义为嵌套的。 示例映射(为了本示例的简洁性而简化): 我插入到索引中的文档如下所示: 是否可以组成一个返回所有城市(所有国家)并支持排序的查询 第一个返回页面(回复)将包含捷克共和国的10个城市,第二个页面将包含10个城市,其中四个(最后一个)来自捷克共和国,六个来自斯洛伐克。 我正在研究复

  • 以下是我的查询的简化版本: 希望有办法解决这个... 提前感谢你的帮助

  • 我有一个索引,它有嵌套的字段。我想在响应中只包括特定的嵌套对象,基于条件以及其他字段。例如,考虑映射 我想按名称搜索用户,并希望响应只包括嵌套对象包含country='U.S.“。请考虑用户索引中的以下文档 我期待搜索结果如下 请为我提供一个合适的elasticsearch查询以获取此文档

  • 我将Elasticsearch 6与PHP结合使用。 我的文档有一个嵌套字段,如下所示: 基本上每个文档都有很多价格,但我知道每个文档只有一个价格与过滤器/查询匹配。 我用它来搜索和排序,改编自这里的教程:https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-sorting.html(对PHP数组格式表示抱歉): 我得

  • 问题内容: 我想在每个更新时间将一个对象添加到字段中。 例如,我有一个文档: 下次,我想在测试字段中添加一个对象并保存旧对象。结果是: 如何实现? 编辑 我使用脚本: 但是,我得到了例外: 编辑 现在,我想添加一个字段以确保更新或插入对象。例如: 当我更新字段时,当id存在时,我将更新对象。相反,我将插入对象。 问题答案: 我建议尝试这样的脚本,该脚本在参数中带有两个参数。它将检查任何嵌套对象是否