在Elasticsearch中,如何获取特定用户的文档的时差平均值?

时间:2018-11-26 23:46:44

标签: elasticsearch

让我们说一个Elasticsearch文档可能看起来像这样:

{
    "created": "2018-11-26T22:20:01+00:00",
    "user_id": 2,
    "text": "Test!"
    "verb": "comment_posted",
    "thread_id": 1
}

我想按动词过滤为仅“ comment_posted”,然后获取每个用户对特定帖子(创建的字段)的评论之间的平均时间。

这是示例数据集和预期结果:

  • 用户'A'于1:30在线程'1'上发布(启动线程)

  • 用户'B'于1:45在线程'2'上发布(启动线程)

  • 用户'A'在2:00在线程'2'上发布

  • 用户“ B”于3:30在线程“ 1”上发布

  • 用户'B'在4:30在线程'1'上发布

  • 用户'A'在5:15在线程'1'上发布

用户“ A”平均需要30分钟(2:00-1:45和5:15-4:30),用户“ B”平均需要120分钟(3:30-1 :30和4:30-3:30)。

查询内容如何?

1 个答案:

答案 0 :(得分:0)

简短答案

这样做可能是可能,但不是推荐

好答案

通常,要做类似的事情,您需要使用aggregation

唯一允许计算增量的聚合是Serial Differencing Aggregation。但是,它应在直方图或日期直方图聚合的上下文中使用。

在您的情况下,要在每个直方图存储桶中获得单个注释,您可以创建一个很小的存储桶(例如,细分为一秒)的直方图,然后使用序列差分获取时间增量。 但是,如ElasticSearch论坛上的this answer所述,这在性能上会很糟糕。

所以这里的答案是,您需要在索引时计算这些增量,或者如果有的话,则使用其他商店的数据(例如,在Postgres中非常容易计算)。