我有一个称为“事件”的索引,其中每个文档都是不同的事件。 事件由具有内部ID的设备生成。
我想按“ deviceId”对事件进行分组,然后按事件生成的事件数量进行汇总。 如果特定设备是从0到10个事件(文档)生成的,则存储桶可以是“ 0-10”,分别是“ 10-100”,“ 100-1000”,“ 1000 +”。
似乎,我需要“管道聚合”,但是由于我对Elastic完全陌生,因此看起来有些棘手,而且我无法为此找到合适的查询。 已经尝试了许多具有不同嵌套级别的不同组合。
结果,我将不计算此范围段的每一组中有多少个设备。如果我想获取设备列表或特定的设备详细信息(这都是新查询,并且与此无关,),则还需要在存储桶中提供DeviceId。
以下示例代码肯定无法正常工作:
@login_required
@transaction.atomic
def profile(request):
if request.method == 'POST':
u_form = UserUpdateForm(request.POST, instance=request.user)
p_form = ProfileUpdateForm(request.POST, instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, f'Your account has been updated!')
return redirect('profile')
else:
u_form = UserUpdateForm(instance=request.user)
p_form = ProfileUpdateForm(instance=request.user.profile)
context = {
'u_form': u_form,
'p_form': p_form
}
return render(request, 'users/profile.html', context)
结果我不想得到:
GET events/_search { "size": 0, "aggs": {
"perMonth": {
"date_histogram": {
"field": "timestamp",
"interval": "1M",
"min_doc_count": 0
},
"aggs": {
"byDevice": {
"terms": {
"field": "deviceId"
}
},
"0-10": {
"bucket_script": {
"buckets_path": {
"count": "byDevice>_count"
},
"script": "params.count <= 10"
}
},
"10-100": {
"bucket_script": {
"buckets_path": {
"count": "byDevice>_count"
},
"script": "params.count > 10 && params.count >= 100"
}
},
"100-1000": {
"bucket_script": {
"buckets_path": {
"count": "byDevice>_count"
},
"script": "params.count > 100 && params.count >= 1000"
}
},
"1000+": {
"bucket_script": {
"buckets_path": {
"count": "byDevice>_count"
},
"script": "params.count > 1000"
}
}
}
}
}
}