搜索结果正在快递途中

多纬度的筛选分别聚合计算是否有可能?

Elasticsearch | 作者 God_lockin | 发布于2019年05月17日 | 阅读数:1517

现在遇到个需求,一条数据有id,date,max,min几个字段,需要找到大于minDate的最小的date所在的数据,取它的min,找到小于maxDate的最大date所在的数据,取它的max,然后求(max - min)/ max,然后对这个值进行排序取最大的几个
 
数据mapping:
{
"id": {
"type": "keyword"
},
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},"max":{
"type":"double"
},"min":{
"type":"double"
}
}
我想到的是先terms把id聚合起来,然后用max_bucket_selector和min_bucket_selector找到最大最小的日子,然后再对它们分别的min和max做计算,但是发现这俩selector没法写,date_histogram只能抓到每一天的日期,抓不到最大和最小的数据,各位老哥有没建议?
已邀请:

rochy - rochy_he

赞同来自:

可以试试聚合里面 script agg 使用 map_script 和 reduce_script,看是否可以解决你的问题

God_lockin

赞同来自:

{
"size": 1,
"aggs": {
"profit": {
"scripted_metric": {
"init_script": "state.baseMap = new HashMap(); state.trgtMap = new HashMap();",
"map_script": "String stock_code = doc.stock_code.value; if (null == doc.date) { return;} if (!state.baseMap.containsKey(stock_code)) { state.baseMap.put(stock_code, new HashMap()); } Map mapForStock = state.baseMap.get(stock_code); if (!mapForStock.containsKey('max')) { mapForStock.put('max', doc); } else { Map tmp = mapForStock.get('max'); if (tmp.date.value.millisOfSecond < doc.date.value.millisOfSecond) { mapForStock.put('max', doc); } } if (!mapForStock.containsKey('min')) { mapForStock.put('min', doc); } else { Map tmp = mapForStock.get('min');if (tmp.date.value.millisOfSecond > doc.date.value.millisOfSecond) { mapForStock.put('min', doc); } }",
"combine_script": "??",
"reduce_script": "??"
}
}
}
}

要回复问题请先登录注册