目录

  • 1 普通聚合分析

    • 1.1 直接聚合统计
    • 1.2 先检索, 再聚合
    • 1.3 扩展: fielddata和keyword的聚合比较
  • 2 嵌套聚合
    • 2.1 先分组, 再聚合统计
    • 2.2 先分组, 再统计, 最后排序
    • 2.3 先分组, 组内再分组, 然后统计、排序
  • 版权声明

1 普通聚合分析

1.1 直接聚合统计

(1) 计算每个tag下的文档数量, 请求语法:

GET book_shop/it_book/_search
{"size": 0,               // 不显示命中(hits)的所有文档信息"aggs": {"group_by_tags": {    // 聚合结果的名称, 需要自定义(复制时请去掉此注释)"terms": {"field": "tags"}}}
}

(2) 发生错误:

说明: 索引book_shop的mapping映射是ES自动创建的, 它把tag解析成了text类型, 在发起对tag的聚合请求后, 将抛出如下错误:

{"error": {"root_cause": [{"type": "illegal_argument_exception","reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [tags] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."}],"type": "search_phase_execution_exception","reason": "all shards failed","phase": "query","grouped": true,"failed_shards": [......]},"status": 400
}

(3) 错误分析:

错误信息: Set fielddata=true on [xxxx] ......
错误分析: 默认情况下, Elasticsearch 对 text 类型的字段(field)禁用了 fielddata;
text 类型的字段在创建索引时会进行分词处理, 而聚合操作必须基于字段的原始值进行分析;
所以如果要对 text 类型的字段进行聚合操作, 就需要存储其原始值 —— 创建mapping时指定fielddata=true, 以便通过反转倒排索引(即正排索引)将索引数据加载至内存中.

(4) 解决方案一: 对text类型的字段开启fielddata属性:

  • 将要分组统计的text field(即tags)的fielddata设置为true:

    PUT book_shop/_mapping/it_book
    {"properties": {"tags": {"type": "text","fielddata": true}}
    }
    
  • 可参考官方文档进行设置:
    https://www.elastic.co/guide/en/elasticsearch/reference/6.6/fielddata.html. 成功后的结果如下:

    {"acknowledged": true
    }
    
  • 再次统计, 得到的结果如下:

    {"took": 153,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 4,"max_score": 0.0,"hits": []},"aggregations": {"group_by_tags": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 6,"buckets": [{"key": "java","doc_count": 3},{"key": "程","doc_count": 2},......]}}
    }
    

(5) 解决方法二: 使用内置keyword字段:

  • 开启fielddata将占用大量的内存.

  • Elasticsearch 5.x 版本开始支持通过text的内置字段keyword作精确查询、聚合分析:

    GET shop/it_book/_search
    {"size": 0,"aggs": {"group_by_tags": {"terms": {"field": "tags.keyword" // 使用text类型的内置keyword字段}}}
    }
    

1.2 先检索, 再聚合

(1) 统计name中含有“jvm”的图书中每个tag的文档数量, 请求语法:

GET book_shop/it_book/_search
{"query": {"match": { "name": "jvm" }}, "aggs": {"group_by_tags": {  // 聚合结果的名称, 需要自定义. 下面使用内置的keyword字段: "terms": { "field": "tags.keyword" }}}
}

(2) 响应结果:

{"took" : 7,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.64072424,"hits" : [{"_index" : "book_shop","_type" : "it_book","_id" : "2","_score" : 0.64072424,"_source" : {"name" : "深入理解Java虚拟机:JVM高级特性与最佳实践","author" : "周志明","category" : "编程语言","desc" : "Java图书领域公认的经典著作","price" : 79.0,"date" : "2013-10-01","publisher" : "机械工业出版社","tags" : ["Java","虚拟机","最佳实践"]}}]},"aggregations" : {"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "Java","doc_count" : 1},{"key" : "最佳实践","doc_count" : 1},{"key" : "虚拟机","doc_count" : 1}]}}
}

1.3 扩展: fielddata和keyword的聚合比较

  • 为某个 text 类型的字段开启fielddata字段后, 聚合分析操作会对这个字段的所有分词分别进行聚合, 获得的结果大多数情况下并不符合我们的需求.

  • 使用keyword内置字段, 不会对相关的分词进行聚合, 结果可能更有用.

—— 推荐使用text类型字段的内置keyword进行聚合操作.

2 嵌套聚合

2.1 先分组, 再聚合统计

(1) 先按tags分组, 再计算每个tag下图书的平均价格, 请求语法:

GET book_shop/it_book/_search
{"size": 0, "aggs": {"group_by_tags": {"terms": { "field": "tags.keyword" },"aggs": {"avg_price": {"avg": { "field": "price" }}}}}
}

(2) 响应结果:

  "hits" : {"total" : 3,"max_score" : 0.0,"hits" : [ ]},"aggregations" : {"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "Java","doc_count" : 3,"avg_price" : {"value" : 102.33333333333333}},{"key" : "编程语言","doc_count" : 2,"avg_price" : {"value" : 114.0}},......]}}

2.2 先分组, 再统计, 最后排序

(1) 计算每个tag下图书的平均价格, 再按平均价格降序排序, 查询语法:

GET book_shop/it_book/_search
{"size": 0,"aggs": {"all_tags": {"terms": {"field": "tags.keyword", "order": { "avg_price": "desc" } // 根据下述统计的结果排序},"aggs": {"avg_price": {"avg": { "field": "price" }}}}}
}

(2) 响应结果:

与#2.1节内容相似, 区别在于按照价格排序显示了.

2.3 先分组, 组内再分组, 然后统计、排序

(1) 先按价格区间分组, 组内再按tags分组, 计算每个tags组的平均价格, 查询语法:

GET book_shop/it_book/_search
{"size": 0, "aggs": {"group_by_price": {"range": {"field": "price", "ranges": [{ "from": 00,  "to": 100 },{ "from": 100, "to": 150 }]}, "aggs": {"group_by_tags": {"terms": { "field": "tags.keyword" }, "aggs": {"avg_price": {"avg": { "field": "price" }}}}}}}
}

(2) 响应结果:

  "hits" : {"total" : 3,"max_score" : 0.0,"hits" : [ ]},"aggregations" : {"group_by_price" : {"buckets" : [{"key" : "0.0-100.0",    // 区间0.0-100.0"from" : 0.0,"to" : 100.0,"doc_count" : 1,        // 共查找到了3条文档"group_by_tags" : {     // 对tags分组聚合"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "Java","doc_count" : 1,"avg_price" : {"value" : 79.0}},......]}},{"key" : "100.0-150.0","from" : 100.0,"to" : 150.0,"doc_count" : 2,"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "Java","doc_count" : 2,"avg_price" : {"value" : 114.0}},......}]}}]}}

通过 Elasticsearch 实现聚合检索相关推荐

  1. es统计有多少个分组_ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)

    1 普通聚合分析 1.1 直接聚合统计 (1) 计算每个tag下的文档数量, 请求语法: GET book_shop/it_book/_search { "size": 0, // ...

  2. elasticsearch实现类似京东的商品搜索效果(elasticsearch动态聚合)

    用到京东的对其搜索应该不会陌生,其搜索也是使用elasticsearch完成的,下图为一个搜索效果图: 搜索筛选条件会根据查询返回的结果动态变化,要实现这个功能就要用到elasticsearch的聚合 ...

  3. Elasticsearch系列---聚合查询原理

    概要 本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先. 正排索引 聚合查询的内部原理是什么,Elastich ...

  4. 用 mongodb + elasticsearch 实现中文检索

    2019独角兽企业重金招聘Python工程师标准>>> 而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端 ...

  5. elasticsearch(7)聚合统计-分组聚合

    原文:https://blog.csdn.net/sz85850597/article/details/82858831 elasticsearch(7)聚合统计-分组聚合 2018年09月26日 2 ...

  6. elasticsearch aggregations_Elasticsearch聚合的嵌套桶如何排序

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总及配套源码,涉及Java.Docker.K8S.Devops等 关于嵌套桶 在 ...

  7. java es scroll,Elasticsearch Scroll分页检索案例分享

    Elasticsearch Scroll分页检索案例分享 1.准备工作 2.定义scroll检索dsl 首先定义一个简单的scroll dsl检索脚本 { ## 这里都是用常量在操作,实际场景中可以参 ...

  8. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 系统小说 www.kuwx.net 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch ...

  9. Elasticsearch 4: 相关性检索和组合查询

    目录 1. 相关性评分 2. 相关度模型 2.1 布尔模型 2.2 向量空间模型 2.3 概率模型 2.4 语言模型 3. TF/IDF 4. BM25 4.1 词频饱和度 4.2 长度归一化 5. ...

最新文章

  1. Jvm(4),保持线程可见性的几种方法
  2. Spark Troubleshooting - Task not serializable问题分析
  3. phpexcel 将excel数据导入到mysql数据库_phpexcel导入excel到mysql数据库(示例)
  4. express框架安装步骤
  5. R语言编程 第一讲 变量与赋值
  6. [云炬创业基础笔记] 第四章测试9
  7. Keepalived高可用集群来实现web服务器负载均衡集群
  8. 反射练习之越过泛型检查
  9. python在律师上作中的实例_基于Python的律师信息查询接口调用代码实例
  10. this_scope_call_apply_bind_柯里化 详细分析
  11. 数据分析引擎之Kylin学习笔记
  12. web前端开发(一)—HTML基础
  13. 小学计算机画图课件第一册,第一册信息技术课件-第三章 第1课 认识“画图”软件 甘少版(共12张PPT)...
  14. openwrtx86安装docker_群晖Docker安装openwrt简易流程
  15. JAVA四大名著(程序员必读)
  16. 国密算法SM3与SM4简介与应用
  17. python中的函数
  18. mysql从数据库误删.idb / .frm 文件,恢复数据方法
  19. 电路仿真软件LTspice 使用教程
  20. Flink Record has Long.MIN_VALUE timestamp (= no timestamp marker). Is the time characteristic

热门文章

  1. Win10体验优化策略
  2. 微信菜单 html页面添加的,微信公众号添加菜单栏外部链接(微信添加外部链接方法)...
  3. 七种常见的数据分析方法拆解
  4. java 连接ntp服务器_NTP搭建-时间服务器
  5. mysql存储爬虫图片_爬取微博图片数据存到Mysql中遇到的各种坑\爬取微博图片\Mysql存储图片\微博爬虫...
  6. python用1000张照片合成一张_有没有什么惊艳的微信头像?Python一键下载1000张!...
  7. 软件测试岗位会越来越少吗?
  8. TCP/IP illustrated 阅读笔记(四) UDP协议和IP分段
  9. Java——单例模式和延迟加载
  10. 第八届蓝桥杯(软件类)决赛C/C++B组真题题解