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)的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 服务器上非常简单的 AVG() 聚合查询需要很长时间
代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?