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

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

}

}

}

再次统计, 得到的结果如下:

{

"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

}

},

......

}

]

}

}

]

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python程序运行原理_谈谈 Python 程序的运行原理

因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新。请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的读书笔记,整理完之后才发现很长,那就将就看吧。…

3.JDK和JRE和JVM的区别

JDK --Java Development Kit --java 开发工具包 JRE --Java Runtime Environment --java运行时环境 JVM --Java Virtual Machine --java虚拟机 ------------- 更多的Java,Angular,Android,大数据,J2EE,Python…

缓存cache

由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内…

微信小程序 等待几秒、_微信小程序—setTimeout定时器的坑

背景实验室需要将项目的app搬到微信的小程序上,终于知道为什么程序员是手艺人了,只要有需求,就要想方设法去填充这种需求,去年是小程序的元年了可以说,去年冬天一个叫跳一跳的小程序游戏出现在我的微信中,当…

linux中断处理模式,Linux在保护模式下的中断处理分析.pdf

Linux在保护模式下的中断处理分析.pdfLinux 在保护模式下的中断处理分析刘万里 杨 斌(西南交通大学计算机与通信工程学院,成都 610031)E-mail:awan摘 要 该文以 80x86 保护模式下的中断处理方法为基础,针对 Linux 在实时嵌入式系统中的具体应…

python3.7是什么_Python 3.7 有什么新变化

idlelib 与 IDLE 多个对自动补全的修正。 (由 Louie Lu 在 bpo-15786 中贡献。) Module Browser (在 File 菜单中,之前称为 Class Browser) 现在会在最高层级函数和类之外显示嵌套的函数和类。 (由 Guilherme Polo, Cheryl Sabell…

4.JVM简述

JVM是一种规范。 就是一个虚拟的用于执行bytecodes字节码的计算机 可以用软件来实现,如IBM,SUN,BEA等按照这个规范实现,可以实现比SUN公司更好的JVM,我们自己也可以实现一个。 可以使用硬件来实现,如sun与intel公司研发java的芯…

python ssh shell交互_使用Paramiko在Python上用ssh实现交互式shell?

我想编写一个程序(在Windows 7上的Python 3.x中),它通过ssh在远程shell上执行多个命令.在查看paramikos的exec_command()函数之后,我意识到它不适合我的用例(因为在执行命令后通道被关闭),因为命令依赖于环境变量(由先前的命令设置)并且不能连接到一个exec_command()调用,因为它…

linux7如何进入紧急模式,CentOS7开机进入紧急模式EmergencyMode的解决办法

iOS Runtime学习笔记Associated Objects: interface NSObject (AssociatedObject) property (nonatomic, strong) id associat ...Vim,极简使用教程,让你瞬间脱离键鼠切换的痛苦注:看大家对Vim仇恨极大,其实它只是一种文本操作方式,可以减少键鼠的切换,从…

用pycharm写python_如何利用pyCharm编写和运行python文件

在安装python环境后,通常可以利用IDE pyCharm来编译我们的python文件。创建一个python文件夹,用pyCharm打开文件夹,在文件夹中新建一个python文件demo.py 也许你知道用cmd中的python指令 python demo.py去运行这个文件,但是如何在…

5.JDK环境配置

下载 进入Oracle官网下载,点击进入 安装 一路下一步。记住安装到哪里了。 配置环境变量 JAVA_HOME 刚才的java安装目录 PATH %JAVA_HOME%\bin PATH里配置多个用英文的分号; 分隔。 *classpath,jdk5.0以上可以不用配置了 测试 windows下&#xf…

GBK 编码

GBK编码范围:8140-FEFE,汉字编码范围见第二节:码位分配及顺序。 GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准。GBK编码依然采用双字节编码方案,其编码范围:8140&#x…

less webpack 热更新_webpack---less+热更新 使用

最近尝试用less写界面,webpack进行打包,然后发现每次修改less时都需要重新执行webpack打包一下,于是就想到了webpack热更新这个功能。一、使用lessless是一门css预处理语言,它是拓展了css,增加了变量,Mixin等等。使用l…

6.第一个程序Hello World

新建文件夹 在C盘新建个文件夹 mycode。注意不要用中文。 新建java文件 1、显示隐藏文件名。 2、右键新建文本文件 3、重命名为 Welcome.java。(首字母必须大写。如果不显示隐藏文件名,会是Welcome.java.txt不是java文件) 4、编写代码 p…

pythonstdin_python 笔试输入:sys.stdin.readline和input

①:输入一行数据并输 出两种方法 # 输入一行数据并输出 import sys # 方法一: str1 input() print(input 输入:,str1,len,len(str1)) print(循环遍历输入得到输入的每个字符的ascii码如下:) for i in str1: print(ord(i)) # 方法二&#xff…

c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

C语言中动态分配二维数组复习过程.docC语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的。C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C语言书中…

7.Java常用开发工具

文本编辑器 任意选一款 UltraEdit EditPlus notepad 集成开发环境 IDE:Integrated Development Environment --JBulider (基本淘汰) --Eclipse 普遍使用。https://www.eclipse.org/downloads/ --NetBeans ------------- 更多的Java&a…

python京东商品_Python爬取京东的商品分类与链接

前言本文主要的知识点是使用Python的BeautifulSoup进行多层的遍历。如图所示。只是一个简单的哈,不是爬取里面的隐藏的东西。示例代码from bs4 import BeautifulSoup as bsimport requestsheaders {"host": "www.jd.com","User-Agent&quo…

python加入中小学课程_【python即将进入中学课堂,编程从小抓起,竟然在这几点上应验了】- 环球网校...

【摘要】我们都知道,不论是我们使用的app,还是各种各样的游戏,小程序,都离不开编程软件的贡献,其中python占据了半壁江山,随着大家对python的重视,python即将进入中学课堂,这究竟是好…

用动态规划算法求解最少硬币问题 c语言,动态规划算法求解硬币找零问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼看着这代码怎么这么熟悉。package 动态规划找零;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int change;change scan.nextInt();int[] coins …