Elasticsearch 基于 array 结构 的nested类型的索引的聚合查询

这篇具有很好参考价值的文章主要介绍了Elasticsearch 基于 array 结构 的nested类型的索引的聚合查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这几天在做es的聚合查询,对那种一对多的产品数据查询的时候遇到了一些问题,做一下记录

1.es文档数据结构如下

=====doc 文档一
{
    "id": "IEO29R12KN912NDF893",
    "products": [
        {
            "product_name": "电视机",
            "budget": 2000
        },
        {
            "product_name": "手机",
            "budget": 851
        }
    ],
    "publish_year": "2020"
}
=====doc 文档二
{
    "id": "IQFJ019238AHJDFK1L9",
    "products": [
        {
            "product_name": "电视机",
            "budget": 2000
        },
        {
            "product_name": "相机",
            "budget": 5000
        },
        {
            "product_name": "扑克牌",
            "budget": 2
        }
    ],
    "publish_year": "2019"
}

2.我的查询需求结果是

针对每个产品名称[product_name]进行分组,并对预算[budget]求和

3.我期望的查询结果

产品名称 预算
电视机 4000
手机 851
相机 5000
扑克牌 2

4.错误的es查询以及结果

4.1查询的es语句和结果

es查询语句==简化版

{
  "from": 0,
  "size": 14,
  "aggs": {
    "aggs_of_product": {
      "terms": {
        "field": "products.product_name.keyword"
      },
      "aggs": {
        "aggs_sum_of_budget": {
          "sum": {
            "field": "products.budget"
          }
        }
      }
    }
  }doc 文档二
}

es查询的结果==简化版

{
    "aggregations": {
        "aggs_of_product": {
            "buckets": [
                {
                    "key": "电视机",
                    "doc_count": 2,
                    "aggs_sum_of_budget": {
                        "value": 9853
                    }
                },
                {
                    "key": "手机",
                    "doc_count": 1,
                    "aggs_sum_of_budget": {
                        "value": 2851
                    }
                },
                {
                    "key": "相机",
                    "doc_count": 1,
                    "aggs_sum_of_budget": {
                        "value": 7002
                    }
                },
                {
                    "key": "扑克牌",
                    "doc_count": 1,
                    "aggs_sum_of_budget": {
                        "value": 7002
                    }
                }
            ]
        }
    }
}

4.2 错误的原因

注意电视机的doc_count为2,这里我们可以根据电视,相机,扑克牌的预算和可以得出结论。以相机为例:他计算的sum值是把命中相机的[doc 文档二]下面的产品的budget预算全部求和了,这里的es聚合查询在这里就不适用了。

如果一个文档里面只有一个产品的话,那这个es查询语句查出的结果就是正确的。

5.解决方案

在经过多次的google和百度后我发现了一个问题,就是我的计算思路是没问题的,主要问题还在在products的这个字段的类型,最开始products的类型是默认的,后面需要把他改为nested[嵌套]类型的才可以

5.1 字段索引mapping的修改

之前products的mapping

{
    "mappings": {
        "properties": {
            "products": {
                "properties": {
                    "product_name": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "budget": {
                        "type": "float"
                    }
                }
            }
        }
    }
}

修改products之后的mapping

把products的字段类型改为nested嵌套类型的。
多一个 “type”: “nested”

{
    "mappings": {
        "properties": {
            "products": {
                "type": "nested",
                "properties": {
                    "product_name": {
                        "type": "text",
                        "fields": {
                            "keyword": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    },
                    "budget": {
                        "type": "float"
                    }
                }
            }
        }
    }
}

5.2 修改后的es查询语句

{
    "aggs": {
        "nested_name": {
            "nested": {
                "path": "products"
            },
            "aggs": {
                "aggs_of_product": {
                    "terms": {
                        "field": "products.product_name.keyword"     
                    },
                    "aggs": {
                        "aggs_sum_of_budget": {
                            "sum": {
                                "field": "products.budget"
                            }
                        }
                    }
                }
            }
        }
    }
}

5.3 修改后的查询结果

{
    "aggregations": {
        "aggr_field_product": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 36126,
            "buckets": [
                {
                    "key": "电视机",
                    "doc_count": 2,
                    "sum_eventTime": {
                        "value": 4000
                    }
                },
                {
                    "key": "手机",
                    "doc_count": 1,
                    "sum_eventTime": {
                        "value": 851
                    }
                },
                {
                    "key": "相机",
                    "doc_count": 1,
                    "sum_eventTime": {
                        "value": 5000
                    }
                },
                {
                    "key": "扑克牌",
                    "doc_count": 1,
                    "sum_eventTime": {
                        "value": 2
                    }
                }
            ]
        }
    }
}

6.参考资料
stackoverflow-nested-array-of-objects-aggregation-in-elasticsearch
Elasticsearch 7.x Nested 嵌套类型查询-知乎
Elasticsearch Nested类型深入详解文章来源地址https://www.toymoban.com/news/detail-603093.html

到了这里,关于Elasticsearch 基于 array 结构 的nested类型的索引的聚合查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入了解ElasticSearch的Nested数据类型

    这个时候就需要用到nested,nested类型是object数据类型的特殊版本,它允许对象数组以一种可以相互独立查询的方式进行索引。 在Nested内部,每个对象索引其实是一个单独的隐藏文档,这意味着每个嵌套对象都可以独立于其他对象进行查询。 使用Nested需要先创建索引,依旧通

    2024年04月10日
    浏览(66)
  • 6.ELK之Elasticsearch嵌套(Nested)类型

    在Elasticsearch实际应用中经常会遇到嵌套文档的情况,而且会有“对象数组彼此独立地进行索引和查询的诉求”。在ES中这种嵌套文档称为父子文档,父子文档“彼此独立地进行查询”至少有以下两种方式: 1)父子文档。在ES的5.x版本中通过parent-child父子type实现,即一个索引

    2024年02月03日
    浏览(44)
  • Elasticsearch中object类型与nested类型以及数组之间的区别

    0、一般情况下用object 类型来查es中为json对象的字段数据,用nested来查es中为JsonArray数组类型的字段数据。 1、默认情况下ES会把JSON对象直接映射为object类型,只有手动设置才会映射为nested类型 2、object类型可以直接使用普通的逗号(.)查询,比如 3、nested类型的查询需要使用

    2024年01月22日
    浏览(55)
  • Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?

    这是来自社区的一个真实企业场景问题。 https://elasticsearch.cn/question/13135 如下所示, 希望在查出的结果后, 对结果进行后处理,对tags列表,根据depth进行排序。 Elasticsearch 能支持的排序方式罗列如下: 包含但不限于: 基于特定字段的排序 基于Nested对象字段的排序 基于特定

    2024年02月02日
    浏览(42)
  • Elasticsearch(019):es常见的字段映射类型之数组类型(arrays)

    在Elasticsearch中,没有专用的array数据类型。默认情况下,任何字段都可以包含零个或多个值,但是,数组中的所有值都必须具有相同的数据类型。 这一点是区别于nested的,nested指的对象的集合。而arrays则是单一类型的数组集合而已。 此外,不需要专门的类型类定义数组类型

    2024年02月13日
    浏览(30)
  • Elasticsearch实战(二十四)---ES数据建模一对多模型Nested结构

    我们如何把Mysql的模型合理的在ES中去实现? 就需要你对要存储的数据足够的了解,及对应用场景足够的深入分析,才能建立一个合适的模型,便于你后期扩展 一对一 模型 一对多 模型 多对多 模型 上一篇,我们介绍了 一对多模型,采用Object对象存储的巨大缺陷,本篇文章,我们

    2024年02月14日
    浏览(36)
  • Elasticsearch8.8.0 SpringBoot实战操作各种案例(索引操作、聚合、复杂查询、嵌套等)

    Elasticsearch8.8.0 全网最新版教程 从入门到精通 通俗易懂 引入依赖 添加配置文件 application.yaml 导入ca证书到项目中 从任意一个es容器中,拷贝证书到resources目录下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EXytUrDp-1691330960034)(media/16912196423122/16

    2024年02月13日
    浏览(44)
  • 解决Elasticsearch的Text类型的字段参与聚合和排序

    text字段类型用于全文内容,例如电子邮件正文或产品说明,并且es会通过分析器对字符串进行分词,可以在全文检索中搜索单独的单词。文本字段最适合非结构化但可读的内容并且不用于排序,也很少用于聚合 keyword主要用于结构化内容的字段,并且总是会有相同值的字段。

    2024年02月11日
    浏览(31)
  • ElasticSearch修改索引字段类型

    线上功能报错,一看日志是往es中添加数据报错,错误日志如下: 说是数据中有个字段类型转换错误,一查es脚本工具,果然生产es索引中categoryId这个字段是integer类型,而实际是long类型。 es不能直接修改索引字段类型,需要删除调新建,具体方法如下 我这次遇到问题的es索引

    2023年04月08日
    浏览(27)
  • Spring Boot Elasticsearch7.6.2实现创建索引、删除索引、判断索引是否存在、获取/添加/删除/更新索引别名、单条/批量插入、单条/批量更新、删除数据、递归统计ES聚合的数据

    注意:我的版本是elasticsearch7.6.2、spring-boot-starter-data-elasticsearch-2.5.6 引入依赖 有时候你可能需要查询大批量的数据,建议加上下面配置文件

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包