elasticsearch - 弹性获取具有最小/最大值和最后一个值的文档

标签 elasticsearch

假设我有一个包含以下数据的 flex 索引:

{"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用于最小值和最大值而不是最小值或最大值聚合的原因)。

到目前为止,我有此查询:
{
  "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"]
      }
    }
  }
}

该查询正确返回了最小值和最大值,但没有为var4返回正确的后3个值,因为该查询从给定时间间隔内的所有文档中获取最后一个值,而不是其中包含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"
            ]
          }
        }
      }
    }
  }
}

关于elasticsearch - 弹性获取具有最小/最大值和最后一个值的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54668631/

相关文章:

java - 如何使用数组中的字段对ElasticSearch索引进行排序?

Elasticsearch:从全文搜索中排除一些已知字段

elasticsearch - 使用过滤器对Kibana/Visualize中的值进行计数?

json - 如何从kubernetes容器中流畅地/elasticsearch将 “log” key_name解析为json?

java - 如何将 ElasticSearch 多重匹配搜索查询从 cURL 转换为 JAVA?

python - 将python代码内列表中的doc计数添加到elasticsearch中的字段

javascript - 使用 Elasticsearch 的小部件示例

ruby-on-rails - not_analyzed无法正常工作

solr - 大数据应用的推荐设置

elasticsearch - 在Elasticsearch中将索引的字段类型更改为新索引