ES--script进行时间聚合(非使用date_histogram)

Posted 喜欢雨天的我

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES--script进行时间聚合(非使用date_histogram)相关的知识,希望对你有一定的参考价值。

由于产品线上 日期时间使用的非 ES的date数据结构,导致无法使用date_histogram进行时间聚合的统计。因此这里使用了script来达到聚合的效果。

介绍

本次使用了3亿量的数据进行测试,效果还是蛮差的。这里先将一下使用方式。

  • lang代表使用的脚本方式
  • params需要脚本传递的参数
  • inline脚本字符串 (新版本请使用source)
GET _search

  "query": 
    "match_phrase": 
      "csdq": "江苏省"
    
  
  , "aggs": 
    "date": 
      "terms": 
        "script": 
          "lang": "painless"
          , "params": 
            "filedName": "csrq",
            "type":"1"
          
          , "inline": """
        String type = params.type;
        String filedName = params.filedName;
        int year = Integer.parseInt(doc[filedName].value.substring(0, 4));
        int month = Integer.parseInt(doc[filedName].value.substring(5, 7));
        int day = Integer.parseInt(doc[filedName].value.substring(8, 10));
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, month - 1);
        c.set(Calendar.DAY_OF_MONTH, day);
        String tagName = "";
        if (type.equals("1")) 
            return c.get(Calendar.DAY_OF_WEEK);
         else if (type.equals("2")) 
            return c.get(Calendar.DAY_OF_MONTH);
         else if (type.equals("3")) 
            return c.get(Calendar.MONTH);
        
        return tagName;
          """
        
      
    
  

查询结果

#! Deprecation: Deprecated field [inline] used, expected [source] instead

  "took" : 11369,
  "timed_out" : false,
  "_shards" : 
    "total" : 194,
    "successful" : 194,
    "skipped" : 0,
    "failed" : 0
  ,
  "hits" : 
    "total" : 13977621,
    "max_score" : 3.7853308,
    "hits" : [
      
        "_index" : "test_person",
        "_type" : "person",
        "_id" : "YgYl6WcB4n2gTYRcBZf4",
        "_score" : 3.7853308,
        "_source" : 
      
    ]
  ,
  "aggregations" : 
    "date" : 
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        
          "key" : "6",
          "doc_count" : 1998324
        ,
        
          "key" : "7",
          "doc_count" : 1998120
        ,
        
          "key" : "1",
          "doc_count" : 1997858
        ,
        
          "key" : "3",
          "doc_count" : 1997501
        ,
        
          "key" : "2",
          "doc_count" : 1997068
        ,
        
          "key" : "4",
          "doc_count" : 1995166
        ,
        
          "key" : "5",
          "doc_count" : 1993584
        
      ]
    
  


以上是关于ES--script进行时间聚合(非使用date_histogram)的主要内容,如果未能解决你的问题,请参考以下文章

python获取两个日期间的工作日

js 标准时间转为非标准时间

js 标准时间转为非标准时间

MySQL 服务器上非常简单的 AVG() 聚合查询需要很长时间

ES6ECMA Script 6_简单介绍

代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?