我在弹性搜索的索引中有如下文档
[
{
"Id": 1,
"start": "2021-04-20T00:00:00.000000Z",
"end": "2021-04-22T22:45:20.000000Z",
"event_type": "A"
},
{
"Id": 2,
"start": "2021-04-23T00:01:00.000000Z",
"end": "2021-04-26T21:50:20.000000Z",
"event_type": "B"
},
{
"Id": 3,
"start": "2021-04-27T00:03:30.000000Z",
"end": "2021-04-29T04:15:30.000000Z",
"event_type": "A"
}
]
我想得到每个event_type
总共跨越的天数。例如对于上述文献,event_type A
在"Id": 1
的第一份文件中从20日(开始(到22日(结束(持续了3天,而在"Id": 3
的第三份文件中,从27日(起始(到29日(结束。所以我想得到event_type A
的计数6。event_type B
与"Id": 2
在第二份文件中的时间跨度为4天,从23日(开始(到26日(结束(。所以,对于event_type B
,我希望计数为4。
event_type | 计数 |
---|---|
A | 6 |
B | 4 |
如果json有点锥形,我会一直使用panda来执行这种任务。
data = [
{
"Id": 1,
"start": "2021-04-20T00:00:00.000000Z",
"end": "2021-04-22T22:45:20.000000Z",
"event_type": "A"
},
{
"Id": 2,
"start": "2021-04-23T00:01:00.000000Z",
"end": "2021-04-26T21:50:20.000000Z",
"event_type": "B"
},
{
"Id": 3,
"start": "2021-04-27T00:03:30.000000Z",
"end": "2021-04-29T04:15:30.000000Z",
"event_type": "A"
}
]
df = pd.DataFrame(data)
df['end'] = pd.to_datetime(df['end']).dt.date
df['start'] = pd.to_datetime(df['start']).dt.date
df["diff"] = (df["end"] - df["start"])
print(df.head())
将导致:
Id end event_type start diff
0 1 2021-04-22 A 2021-04-20 2 days
1 2 2021-04-26 B 2021-04-23 3 days
2 3 2021-04-29 A 2021-04-27 2 days
您可以将sum子聚合与下面提到的脚本一起使用
- 在字段
event_type
上使用term
聚合来获取唯一的事件类型 - 添加一个
sum
子聚合,以计算每个事件类型的天数总和 - 在
sum
聚合内部提供script
以计算日差
GET split_range/_search
{
"size": 0,
"aggs": {
"GroupByEventType": {
"terms": {
"field": "event_type",
"size": 10000,
"order": {
"_key": "asc"
}
},
"aggs": {
"sumOfDays": {
"sum": {
"script": """
ZonedDateTime start = doc['start'].value;
ZonedDateTime end = doc['end'].value;
return start.until(end, ChronoUnit.DAYS);
"""
}
}
}
}
}
}
当我对您的问题中提供的样本数据集尝试上述查询时,得到了以下答案。
{
"aggregations" : {
"GroupByEventType" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "A",
"doc_count" : 2,
"sumOfDays" : {
"value" : 4.0
}
},
{
"key" : "B",
"doc_count" : 1,
"sumOfDays" : {
"value" : 3.0
}
}
]
}
}
}
响应包含每个事件类型的子聚合,该子聚合是天数的总和。