Elasticsearch aggregation - support for GROUP BY



我有一个 elasticsearch 集群,其索引具有以下模式:

{
"my_index" : {
"mappings" : {
"test" : {
"properties" : {
"city" : {
"type" : "keyword"
},
"prober" : {
"type" : "keyword"
},
"status" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"test" : {
"type" : "keyword"
},
"time_taken" : {
"type" : "float"
},
"test_start" : {
"type" : "date"
},
"test_uuid" : {
"type" : "keyword"
},
"validity_start" : {
"type" : "date"
},
"validity_end" : {
"type" : "date"
}
}
}
}
}
}

每个test_uuid都是唯一的,每个测试都有架构中列出的不同参数。 我正在尝试过滤/查找所有在特定时间戳下属于validity_startvalidity_end时间窗口的文档。 我当前的查询如下所示:

{
"query": { 
"bool": { 
"filter": [ 
{ "range": { "validity_start": { "lte": "<timestamp>" }}},
{ "range": { "validity_end": { "gte": "<timestamp>" }}} 
]
}
}
}

我有两个问题。

  1. 我想按(test, city, prober)对返回的结果进行分组。在给定的(validity_start, validity_end)窗口内,可能有多个文档具有相同的(test,city,prober)值。我想过滤掉除最近执行的测试(可以通过test_start时间确定)之外的所有文档。有没有办法使用 aggs 或任何其他功能在 elasticsearch 中做到这一点?

  2. 获得这些结果后,我想根据status字段跨某些字段执行聚合。例如,如果有 100 个结果分布在 2 个测试中,testAtestB,我想聚合

    a. 具有testA并通过的结果数量

    b. 具有测试A但未通过的结果数

    c. 有测试B并通过的结果数量

    d. 具有测试B且未通过的结果数。

    城市和探测器也是如此。

"一旦我有了这些结果",您将完成该查询。Elastic 不支持联接查询。可以在客户端执行聚合或运行新查询。
对于您的第一个问题:我总是在 Kibana 中制作可视化(在您的情况下使用子存储桶术语聚合)并查看它发送的查询(您可以使用可视化底部的小箭头图标来获取)。它可能并不总是 100% 准确,但它提供了一个开始。

最新更新