我有一个 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_start
和validity_end
时间窗口的文档。 我当前的查询如下所示:
{
"query": {
"bool": {
"filter": [
{ "range": { "validity_start": { "lte": "<timestamp>" }}},
{ "range": { "validity_end": { "gte": "<timestamp>" }}}
]
}
}
}
我有两个问题。
我想按
(test, city, prober)
对返回的结果进行分组。在给定的(validity_start, validity_end)
窗口内,可能有多个文档具有相同的(test,city,prober)
值。我想过滤掉除最近执行的测试(可以通过test_start
时间确定)之外的所有文档。有没有办法使用 aggs 或任何其他功能在 elasticsearch 中做到这一点?获得这些结果后,我想根据
status
字段跨某些字段执行聚合。例如,如果有 100 个结果分布在 2 个测试中,testA
和testB
,我想聚合a. 具有testA并通过的结果数量
b. 具有测试A但未通过的结果数
c. 有测试B并通过的结果数量
d. 具有测试B且未通过的结果数。
城市和探测器也是如此。
"一旦我有了这些结果",您将完成该查询。Elastic 不支持联接查询。可以在客户端执行聚合或运行新查询。
对于您的第一个问题:我总是在 Kibana 中制作可视化(在您的情况下使用子存储桶术语聚合)并查看它发送的查询(您可以使用可视化底部的小箭头图标来获取)。它可能并不总是 100% 准确,但它提供了一个开始。