如何计算elasticsearch中的重叠/经过时间范围?

时间:2017-11-17 03:18:25

标签: elasticsearch

我在ES中有一些记录,它们是人们在不同时间加入/离开的不同在线会议记录。

{name:"p1", join:'2017-11-17T00:01:00.293Z', leave: "2017-11-17T00:06:00.293Z"}
{name:"p2", join:'2017-11-17T00:02:00.293Z', leave: "2017-11-17T00:04:00.293Z"}
{name:"p3", join:'2017-11-17T00:03:00.293Z', leave: "2017-11-17T00:05:00.293Z"}

时间范围可能是这样的:

 p1: [============================================]
 p2:         [=================]
 p3:                  [==================]

问题是如何计算重叠时间范围(共同/会议/共享时间),应该 3分钟

另一个问题是,是否有可能知道何时何时有1/2/3人? 2分钟2人; 1分钟3人

2 个答案:

答案 0 :(得分:2)

我认为只有ES可以做到这一点。仅仅因为你需要的只是在搜索中它应该转到所有匹配的文件并根据

进行计算

我会按照以下步骤进行。

1.在索引新文档之前搜索重叠的文档。

GET /meetings/_search

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "join": {
              "gte": "2007-10-01T00:00:00"
            }
          }
        },
        {
          "range": {
            "leave": {
              "lte": "2007-10-01T00:00:00"
            }
          }
        }
      ]
    }
  }
}
  1. 计算所有重叠文档的后端所有功能。
  2. 保存到文档,nested object重叠您需要的元数据

答案 1 :(得分:1)

您可以使用<Route>max(join)轻松完成第一部分:

min(leave)

然后,您可以在处理Elasticsearch响应或使用bucket script aggregation时计算endTime-startTime。它可能是负数,在这种情况下没有重叠。

对于第二个,它取决于你想要的: 如果您想要可能难以阅读的确切边界,可以使用Scripted Metric Aggregation来完成。

如果您想拥有每个广告位的数量(例如小时),则可能更容易使用Date Histogram Aggregation