• ElasticSearch 分组查询的几个例子


    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

  • 相关阅读:
    机器人走方格问题
    一道数列的规律题(使用递归解决)
    反转单链表
    求一个二叉树的深度以及如何判断一个二叉树是一个平衡二叉树
    打印素数
    DAY28-mysql扩展与预处理-查出问题的关键
    DAY31
    jQuery很简单很基础的
    JavaScript中的事件委托及好处
    结合个人经历总结的前端入门方法
  • 原文地址:https://www.cnblogs.com/-flq/p/9519345.html
Copyright © 2020-2023  润新知