在下面的示例响应中,我有4个hits
,并且一个用户使用不同的event_type
来了两次。我想使用event_type
来计算唯一user_id
的最后一个数据。
{
"hits": [
{
"_index": "index_test",
"_type": "_doc",
"_id": "0yVSN4YBbqa8KnE1E9FS",
"_score": null,
"_source": {
"event_type": "1",
"user_id": "11777"
"event_date": "2023-02-20 07:24:28"
},
"sort": [1675965370212]
},
{
"_index": "index_test",
"_type": "_doc",
"_id": "mXpSN4YBLFzGpeA-E4VI",
"_score": null,
"_source": {
"event_type": "1",
"user_id": "11677"
"event_date": "2023-02-20 08:15:28"
},
"sort": [1675965370207]
},
{
"_index": "index_test",
"_type": "_doc",
"_id": "mnpSN4YBLFzGpeA-E4VM",
"_score": null,
"_source": {
"event_type": "2",
"user_id": "11777"
"event_date": "2023-02-20 08:22:28"
},
"sort": [1675965370210]
},
{
"_index": "index_test",
"_type": "_doc",
"_id": "mHpSN4YBLFzGpeA-E4VD",
"_score": null,
"_source": {
"event_type": "7",
"user_id": "11293"
"event_date": "2023-02-20 08:27:28"
},
"sort": [1675965370202]
}
]
}
我试过top_hits,它是最后一个用户数据。但这里有一些问题top_hits长度是10000,我的数据超过50000。所以所有的结果都没有出来。
第二,我想只计数数据与事件类型明智的。所以,不需要的数据。请帮助我如何才能做到这一点与ElasticSearch查询。
在上面的结果中,我希望输出如下:
{
"aggregations": {
"last_activities": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 1,
"doc_count": 2,
"unique_user": {
"value": 1
}
},
{
"key": 2,
"doc_count": 1,
"unique_user": {
"value": 1
}
},
{
"key": 7,
"doc_count": 1,
"unique_user": {
"value": 1
}
}
]
}
}
}
- 在
event_type : 1
字段中有两个记录,但user_id11777
的最后一个event_type
是2
,因此它不会计入我的聚合 *
聚合查询:
{
"aggs": {
"last_activities": {
"terms": {
"field": "user_id",
"size": 10000
},
"aggs": {
"data": {
"top_hits": {
"size": 1,
"_source": [
"user_id",
"event_type"
],
"sort": {
"created_date": "desc"
}
}
}
}
}
}
}
1条答案
按热度按时间rkkpypqq1#
这不能用常规的聚合来实现,但是可以用
script_metric
aggregation来实现,它允许你实现你自己的逻辑。下面是我的尝试。代码有一部分是注解的,但是应该很简单。运行该命令得到的结果如您所料: