将具有相同内部ID的文档分组,然后按匹配数量将其汇总到存储桶中

时间:2019-07-01 20:57:31

标签: elasticsearch

我有一个称为“事件”的索引,其中每个文档都是不同的事件。 事件由具有内部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"
      }
    }
  }
}
}
}

0 个答案:

没有答案