1、首先创建所以:
PUT test_date
{"settings":{
"number_of_shards":2,
"number_of_replicas":0
}
}
2、创建索引结构
PUT test_date/tag_type/_mapping
{
"tag_type": {
"dynamic": "false",
"_all": {
"enabled": false
},
"properties": {
"sex":{
"type": "string",
"fielddata":true
},
"date0": {
"type": "string",
"fielddata":true
},
"days":{
"type": "integer"
}
}
}
}
3、添加数据结构如下
PUT test_date/tag_type/18
{
"sex":"男",
"date0": "20170101",
"days": 1
}
4、具体的查询语句
POST test_date/tag_type/_search
{
"size":0,
"aggs" : {
"tt":{
"terms":{
"field":"sex"
},
"aggs":{
"date_rpt":{
"scripted_metric":{
"init_script":"params._agg.dates = []",
"map_script":"Map tmp = new HashMap();tmp.put('date',doc.date0.value); tmp.put('cnt',doc.days.value); params._agg.dates.add(tmp);",
"combine_script":"Map combineMap = new HashMap();for(item in params._agg.dates){String key = item.get('date'); long cnt = item.get('cnt'); if(combineMap.containsKey(key)){combineMap.put(key,combineMap.get(key)+cnt)}else{combineMap.put(key,cnt)}} return combineMap",
"reduce_script":"Map map = new HashMap();for(m in params._aggs){ Set keys = m.keySet();for(key in keys){if(map.containsKey(key)){map.put(key,map.get(key)+m.get(key))}else{map.put(key,m.get(key))}}} return map"
}
}}
}
}
}
此处要注意 参数为 params._agg 而 reduce中为 params._aggs
init_script、map_script、combine_script 之间是用过初始化的参数进行联通,不知道还有没有其他的方式,欢迎大家指出。