elasticsearch - 弹性获取具有最小值/最大值和最后一个值的文档
问题描述
假设我有一个包含以下数据的弹性索引:
{"var1": 14, "time": "2019-02-12T13:01:00.000Z"}
{"var2": 1423, "time": "2019-02-12T13:01:02.000Z"}
{"var3": 114, "time": "2019-02-12T13:01:03.000Z"}
{"var2": 214, "time": "2019-02-12T13:01:04.000Z"}
{"var3": 414, "time": "2019-02-12T13:01:05.000Z"}
{"var1": 124, "time": "2019-02-12T13:01:06.000Z"}
{"var2": 914, "time": "2019-02-12T13:01:07.000Z"}
{"var3": 8614, "time": "2019-02-12T13:01:06.000Z"}
{"var2": 74, "time": "2019-02-12T13:01:07.000Z"}
{"var3": 174, "time": "2019-02-12T13:01:08.000Z"}
{"var4": 144, "time": "2019-02-12T13:01:09.000Z"}
{"var4": 714, "time": "2019-02-12T13:01:10.000Z"}
{"var4": 813, "time": "2019-02-12T13:01:11.000Z"}
{"var2": 65, "time": "2019-02-12T13:01:12.000Z"}
{"var1": 321, "time": "2019-02-12T13:01:13.000Z"}
我想编写一个查询,它可以检索给定时间间隔内变量的最小值、变量的最大值和变量的最后 n 个值。重要的是我需要具有最小值或最大值或最后一个值的实际文档(这就是为什么我使用 top_hits 来表示 min 和 max 而不是 min 或 max 聚合)。
到目前为止,我有这个查询:
{
"query": {
"bool": {
"must": [
{
"range": {
"time": {
"gte": "2019-02-12T13:01:00.000Z",
"lt": "2019-02-12T13:01:15.000Z"
}
}
}
]
}
},
"size": 0,
"aggs": {
"max_var1": {
"top_hits": {
"size": 1,
"sort": [{
"var1": {"order": "desc"}
}]
}
},
"min_var2": {
"top_hits": {
"size": 1,
"sort": [{
"var2": {"order": "asc"}
}]
}
},
"last_var4": {
"top_hits": {
"size": 3,
"sort": [{
"time": {"order": "desc"}
}],
"_source": ["var4"]
}
}
}
}
查询正确返回最小值和最大值,但它没有返回正确的最后 3 值var4
,因为它从给定时间间隔内的所有文档中获取最后一个值,而不是其中包含的文档var4
。所以问题是如何在这个查询中获取给定变量的最后 n 个文档。
我知道我可以使用多搜索 API 一次执行多个查询,但我想知道是否可以在一个查询中使用它。
谢谢。
解决方案
过滤聚合来救援。只需确保将last_var4
聚合限制为仅那些实际具有该字段的文档var4
。
{
...
"last_var4": {
"filter": {
"bool": {
"filter": {
"exists": {
"field": "var4"
}
}
}
},
"aggs": {
"last_var4": {
"top_hits": {
"size": 3,
"sort": [
{
"time": {
"order": "desc"
}
}
],
"_source": [
"var4"
]
}
}
}
}
}
}
推荐阅读
- android - Android - 带通知的计划检查
- r - 为 R 中数据 2 中的每个 id 重复数据帧 1
- javascript - 元音和辅音分组(没有正则表达式)
- docker - 为什么 docker-compose 没有按顺序运行我的命令?
- javascript - 如何调度两个动作,第一个完成后的第二个
- python - zip_longest 的时间复杂度?
- android - 我们是否需要在清单中声明读/写权限才能访问图库中的图像并将它们保存到特定于应用程序的文件存储(外部)?
- javascript - 如何正确创建可以处理值和该值的可观察的组件
- android-automotive - Android Automotive 中的音量处理
- r - 在 shinyapps.io 上安装箭头包