悟空,拿我的打狗棒来

分组后进行排序取第一条,然后再过滤

Elasticsearch | 作者 smart8416 | 发布于2020年10月28日 | 阅读数:6708

表格如下
id	|	typeId	|	grade	|	opeartor	|	op_time
1 | 1 | 1 | I | 2020-10-28 14:21:00
2 | 1 | 3 | U | 2020-10-28 14:22:00
3 | 1 | 3 | D | 2020-10-28 14:23:00
4 | 2 | 1 | I | 2020-10-28 14:21:00
5 | 2 | 4 | U | 2020-10-28 14:23:00
6 | 3 | 2 | I | 2020-10-28 14:21:00
7 | 3 | 3 | U | 2020-10-28 14:24:00
8 | 3 | 1 | U | 2020-10-28 14:23:00
记录每个TypeId的一个日志,其中I代表插入,U代表更新,D代表删除。
想拿到每一个typeId的最新情况,即对typeId分组,然后没一组内,根据op_time进行排序,如果最后一个数据的operator='D',则该分组不需要返回。上面的数据最终返回
id	|	typeId	|	grade	|	opeartor	|	op_time
5 | 2 | 4 | U | 2020-10-28 14:23:00
7 | 3 | 3 | U | 2020-10-28 14:24:00

这种需求用ES查询要怎么写呢?
 
 
已邀请:

Memento - Memento

赞同来自: smart8416 create17

GET test/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
]
}
},
"size": 0,
"aggs": {
"typeIdAgg": {
"terms": {
"field": "typeId",
"size": 10,
"min_doc_count": 1
},
"aggs": {
"top1": {
"top_hits": {
"size": 1,
"sort": [
{
"op_time": {
"order": "desc"
}
}
]
}
}
}
}
}
}
可以通过ES聚合 `typeId`, 然后取每组按 `op_time` 降序的第一个;
置于再过滤最后一个操作是 `D` 的, 应该只能交给代码处理里, ES 无法对非数值聚合结果进行过滤;

要回复问题请先登录注册