ElasticSearch 分组查询的几个例子

摘要:
facets接口可以根据query返回统计数据,其中的terms_stats是分组统计,根据key的情况返回value的统计数据,类似groupby的意思。第4行的ips_stats是对这个分组查询的命名,可以自己随便起。第6行key_field表示对nginx_log.@fields.ip字段进行分组。第7行value_field表示对nginx_log.@fields.request_time的值进行分组后的运算。第5行的size表示查询条件显示的数据条数。statistical是对一个数字字段做统计的facet。

facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思。

"terms_stats" : { "key_field" : "", "value_field" : "" }

例子:查询每个ip的请求执行时间

查询语句:

1: {
2:     "size": 0,
3:     "facets": {
4:         "ips_stats": {
5:             "terms_stats": {
6:                 "key_field": "nginx_log.@fields.ip",
7:                 "value_field": "nginx_log.@fields.request_time",
8:                 "size": 5
9:             }
10:         }
11:     }
12: }

说明:

  • 第2行的 size 表示 hits 命中的返回0条;
  • 第3行的facets,第5行的terms_stats 是做分组查询的必要关键字。
  • 第4行的 ips_stats 是对这个分组查询的命名,可以自己随便起。
  • 第6行 key_field 表示对 nginx_log.@fields.ip 字段进行分组。
  • 第7行 value_field 表示 对 nginx_log.@fields.request_time 的值进行分组后的运算。
  • 第8行的 size 表示分组运算,最多返回多少行。

这个例子的查询结果如下,这里简单起见,只返回了2条。:

1: {
2:     "took": 35641,
3:     "timed_out": false,
4:     "_shards": {
5:         "total": 5,
6:         "successful": 5,
7:         "failed": 0
8:     },
9:     "hits": {
10:         "total": 193109307,
11:         "max_score": 1,
12:         "hits": []
13:     },
14:     "facets": {
15:         "ips_stats": {
16:             "_type": "terms_stats",
17:             "missing": 0,
18:             "terms": [
19:                 {
20:                     "term": "180.149.157.110",
21:                     "count": 1871112,
22:                     "total_count": 1871112,
23:                     "min": 0.016,
24:                     "max": 80.306,
25:                     "total": 545853.1529999943,
26:                     "mean": 0.2917266058899704
27:                 },
28:                 {
29:                     "term": "59.49.225.22",
30:                     "count": 515179,
31:                     "total_count": 515179,
32:                     "min": 0,
33:                     "max": 600.004,
34:                     "total": 27793.9160000002,
35:                     "mean": 0.053950017372602924
36:                 }
37:             ]
38:         }
39:     }
40: }

从结果我们可以看到,我们对 每个ip的执行时间计算了 个数、最大最小值,平均值,合计的计算。

相关技术参考:http://stackoverflow.com/questions/16549001/elasticsearch-order-responses-and-then-facet/16568770

例子:按照每个ip的请求数排序

查询JSON

1: {
2:     "size": 0,
3:     "facets": {
4:         "time_stats": {
5:             "terms_stats": {
6:                 "key_field": "nginx_log.@fields.ip",
7:                 "value_field": "nginx_log.@fields.request_time",
8:                 "size": 2,
9:                 "order": "total"
10:             }
11:         }
12:     }
13: }

只比上述查询多了一个 order 属性.输出结果格式跟上面一样,只不过是排好序的,就不罗列了.

例子:查询整个网站的执行时间

查询json:

1: {
2:     "query": {
3:         "match_all": {}
4:     },
5:     "size": 0,
6:     "facets": {
7:         "stat1": {
8:             "statistical": {
9:                 "field": "nginx_log.@fields.request_time"
10:             }
11:         }
12:     }
13: }

说明:

  • 最初的查询条件我们没有写,意味着取全部,如果你想查询指定范围,可以在这里书写。第2-4行。第5行的size表示查询条件显示的数据条数。
  • statistical 是对一个数字字段做统计的facet。

结果:

1: {
2:     "took": 4824,
3:     "timed_out": false,
4:     "_shards": {
5:         "total": 5,
6:         "successful": 5,
7:         "failed": 0
8:     },
9:     "hits": {
10:         "total": 193109307,
11:         "max_score": 1,
12:         "hits": []
13:     },
14:     "facets": {
15:         "stat1": {
16:             "_type": "statistical",
17:             "count": 142590544,
18:             "total": 59320216.00531181,
19:             "min": 0,
20:             "max": 5347.085,
21:             "mean": 0.4160178812790826,
22:             "sum_of_squares": 14578358539.95768,
23:             "variance": 102.06623708075713,
24:             "std_deviation": 10.102783630304923
25:         }
26:     }
27: }

这个方法的更多参考:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-facets-statistical-facet.html

整体参考资料:

官方向导
http://www.elasticsearch.cn/guide/ 中文版
http://es-cn.medcl.net/guide/ 中文版
http://www.elasticsearch.org/guide/ 英文

翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群
http://www.cnblogs.com/jefurry/tag/ElasticSearch/

免责声明:文章转载自《ElasticSearch 分组查询的几个例子》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux路由表配置kafka时间轮的原理(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ELK 二进制安装并收集nginx日志

对于日志来说,最常见的需求就是收集、存储、查询、展示,开源社区正好有相对应的开源项目:logstash(收集)、elasticsearch(存储+搜索)、kibana(展示),我们将这三个组合起来的技术称之为ELKStack,所以说ELKStack指的是Elasticsearch(java)、Logstash(jruby)、Kibana技术栈的结合, EL...

Elasticsearch之curl删除

   扩展下, Elasticsearch之curl删除索引库 [hadoop@djt002 elasticsearch-2.4.3]$ curl -XDELETE 'http://192.168.80.200:9200/zhouls/emp/1'{"found":true,"_index":"zhouls","_type":"emp","_id":"1"...

ElasticSearch 内存那点事【转】

“该给ES分配多少内存?” “JVM参数如何优化?““为何我的Heap占用这么高?”“为何经常有某个field的数据量超出内存限制的异常?““为何感觉上没多少数据,也会经常Out Of Memory?”以上问题,显然没有一个统一的数学公式能够给出答案。 和数据库类似,ES对于内存的消耗,和很多因素相关,诸如数据总量、mapping设置、查询方式、查询频度等...

Kibana(一张图片胜过千万行日志)

Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。 你用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。 你可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。 Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实...

prometheus监控elasticsearch

prometheus监控es,同样采用exporter的方案。 项目地址: elasticsearch_exporter:https://github.com/justwatchcom/elasticsearch_exporter 1、安装部署 现有es三节点的集群,环境大概如下: 主机 组件 192.168.75.11 prometheus...

springboot在windows集成elk

说明:elk指的是Elasticsearch、Logstash、Kibana的简称 Elasticsearch:是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能; Logstash:是一个用来搜集、分析、过滤日志的工具。 Kibana:是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。 elk的...