Es的针对于nested类型的多重子聚合

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

1.业务背景

        一家店会由多个人维护,一家店会绑定一个城市,现有需求需要找到某个人的常驻城市,具体需求如下,先找到这个人的所有店,再根据城市聚合店,算出店的数量,取店数量最多的城市,如果有多个城市的店数量相同,再根据维护时间倒叙,取时间最近的一家店.

2.数据模型

        "salesmanRefList" : {
          "type" : "nested",
          "properties" : {
            "_class" : {
              "type" : "keyword",
              "index" : false,
              "doc_values" : false
            },
            "createTime" : {
              "type" : "date",
              "format" : "yyyy-MM-dd HH:mm:ss"
            },
            "employeeNo" : {
              "type" : "keyword"
            },
            "entityWsCode" : {
              "type" : "keyword"
            },
            "id" : {
              "type" : "keyword"
            },
            "organizationCode" : {
              "type" : "keyword"
            },
            "positionNo" : {
              "type" : "keyword"
            },
            "postCategoryCode" : {
              "type" : "keyword"
            },
            "updateTime" : {
              "type" : "date",
              "format" : "yyyy-MM-dd HH:mm:ss"
            }
          }
        },
        "orgCode" : {
          "type" : "keyword"
        }

        其中salesmanRefList是人店关系,positionNo是人,createTime是维护时间,org是城市

3.技术实现

        难点在于nested数据类型的聚合,以及需要排除部分数据后的筛选

1,先拿到人的所有店

 "query": {
    "nested": {
      "query": {
        "term": {
          "salesmanRefList.positionNo": {
            "value": "12345678"
          }
        }
      },
      "path": "salesmanRefList"
    }
  }

2.第一次聚合,根据org聚合

"aggs": {
    "poc_count_by_org": {
      "terms": {
        "field": "orgCode"
        }
    }
}

3.因为此时聚合出来的数据,有的人店关系可能不是自己的,所以需要对数据进行过滤,确保下一次聚合时的数据都是与自己相关的,但是nested类型不能直接聚合,需要在前套一层nested类型的聚合,所以这里套了两层聚合

    "aggs": {
        "salesmanRefList_nested":{
          "nested": {
            "path": "salesmanRefList"
          },
          "aggs": {
            "positionNo_nested": {
              "filter": {
                "term": {
                  "salesmanRefList.positionNo": "12345678"
                }
              }
            }
          }
        }
      }

4.最后一次聚合,算出每个poc_count_by_org桶内createTime最大的值

            "aggs": {
                "max_createTime": {
                  "max": {
                    "field": "salesmanRefList.createTime"
                  }
                }
              }

5.最后设置排序,售点按照聚合org后的数量,其次是自己的维护时间

        "order": [
          {
            "_count": "desc"
          },
          {
            "salesmanRefList_nested>positionNo_nested>max_createTime": "desc"
          }
        ]

下面贴出完整dsl语句文章来源地址https://www.toymoban.com/news/detail-522615.html

{
  "size": 0, 
  "query": {
    "nested": {
      "query": {
        "term": {
          "salesmanRefList.positionNo": {
            "value": "12345678"
          }
        }
      },
      "path": "salesmanRefList"
    }
  },
  "aggs": {
    "poc_count_by_org": {
      "terms": {
        "field": "orgCode",
        "order": [
          {
            "_count": "desc"
          },
          {
            "salesmanRefList_nested>positionNo_nested>max_createTime": "desc"
          }
        ]
      },
      "aggs": {
        "salesmanRefList_nested":{
          "nested": {
            "path": "salesmanRefList"
          },
          "aggs": {
            "positionNo_nested": {
              "filter": {
                "term": {
                  "salesmanRefList.positionNo": "12345678"
                }
              },
              "aggs": {
                "max_createTime": {
                  "max": {
                    "field": "salesmanRefList.createTime"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

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

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

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

相关文章

  • es查询nested字段类型数组长度来判断是否包含多个值

    使用es时经常会碰到查询数组格式的字段是否有多个值的情况,总结一下。 一、字段类型为keywork时 当字段类型为keyword时(创建索引后,添加的第一条数据id字段格式为数组格式,便会导致后续的数据都是数组),查询id字段有多值时用以下查询语句: 二、字段类型为nested类型时

    2024年02月11日
    浏览(65)
  • ElasticSearch第五讲 ES nested嵌套文档与父子文档处理

    在ES中,处理实体之间的关系并不像关系型存储那样明显。在关系数据库中的黄金准则 - 数据规范化,在ES中并不适用。在处理关联关系,嵌套对象和父子关联关系中,我们会讨论几种可行方案的优点和缺点。 紧接着在为可扩展性而设计中,我们会讨论ES提供的一些用来快速灵

    2024年02月02日
    浏览(44)
  • es elasticsearch 八 mapping 映射 、复杂数据类型

    目录 Mapping 映射 复杂数据类型 Mapping 映射 精确匹配 必须和对应字段值安全一致才可查出 全文检索 缩写搜索全程、格式转换 大小写 同义词 全文检索核心原理 分词,初步的倒排索引的建立 重建倒排索引 时态转换、重复数的转换、同义词的转换、大小写的转换 分词器 analy

    2024年02月07日
    浏览(57)
  • Elasticsearch (ES) 搜索引擎: 数据类型、动态映射、多类型(子字段)

    原文链接:https://xiets.blog.csdn.net/article/details/132348634 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 映射字段的 数据类型 ,官网文档参考:Field data types。 下面是 ES 常用的一些基本数据类型。 字符串 类型: keyword :类型。 text :文本类型。

    2024年03月23日
    浏览(67)
  • Elasticsearch专栏-6.es基本用法-聚合查询

    在es中,所有的聚合查询都是放在aggs中进行的。平均值、总和、最大、最小、数量对应的分别是:avg、sum、max、min、value_count 分组用到的是terms 上面语句中的size:3,指的是分组后,只展示前三个分组内容。size:0,指的是所有query查询结果,也就是原始数据,不需

    2024年02月09日
    浏览(38)
  • ElasticSearch系列 - SpringBoot整合ES:映射中定义字段的数据类型及属性

    ElasticSearch - SpringBoot整合ES:映射定义字段的数据类型及属性 01. ElasticSearch 搜索结果的准确性和召回率是什么? 在Elasticsearch中,搜索结果的准确性和召回率是非常重要的指标,它们反映了搜索引擎的性能和效果。以下是这两个指标的定义和解释: 准确性:搜索结果的准确性

    2024年02月08日
    浏览(47)
  • ES度量聚合(ElasticSearch Metric Aggregations),Java开发自学教程

    .value( (new MultiValuesSourceFieldConfig.Builder()) .setFieldName(“num”) .setMissing(0) .build() ) .weight( (new MultiValuesSourceFieldConfig.Builder()) .setFieldName(“num”) .setMissing(1) .build() ) // .valueType(ValueType.LONG) ; avg.toString(); sourceBuilder.aggregation(avg); sourceBuilder.size(0); sourceBuilder.query( QueryBuilders.termQuery(“

    2024年04月14日
    浏览(65)
  • ElasticSearch(7.8版本)聚合查询使用javaHighLevelRestClient实现(从MySQL聚合查询概念->ES聚合概念及实操)

    申明:本文是在实现ES聚合功能中,将过程中查找的多篇博客文献拼接在一起,参考到的博文全部在标题中附上了原文的超链接,分享出来仅是为了提做一个笔记以防忘记,并给大家提供一个参考。 聚合操作指的是在数据查找基础上对于数据进一步整理筛选行为,聚合操作也

    2023年04月24日
    浏览(58)
  • 【Elasticsearch学习笔记二】es的Mapping字段映射、Mapping字段常用类型、Mapping映射的创建、查看和更新、es数据迁移、ik分词器

    目录 1、Mapping字段映射概述 2、Mapping字段常用类型 3、映射中对时间类型详解 1)采取自动映射器来映射 2)手工映射提前指定日期类型 4、ES的keyword的属性ignore_above 5、Mapping映射的查看和创建 1)查看mapping信息:GET 索引名/_mapping 2)创建映射:PUT /索引名 3) 查看所有索引映

    2024年01月20日
    浏览(61)
  • 原生语言操作和spring data中RestHighLevelClient操作Elasticsearch,索引,文档的基本操作,es的高级查询.查询结果处理. 数据聚合.相关性系数打分

    ​ Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasti

    2024年02月05日
    浏览(86)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包