Elasticsearch聚合 - 支持GROUP BY

时间:2018-01-25 05:09:33

标签: elasticsearch elasticsearch-aggregation

我有一个带有索引的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,我想汇总

    一个。 testA正在传递的结果数

    湾具有testA且失败的结果数

    ℃。有testB并且正在传递的结果数

    d。具有testB并且失败的结果数。

    同样适用于城市和探索者。

1 个答案:

答案 0 :(得分:0)

&#39;一旦我得到了这些结果&#39;您将完成该查询。 Elastic不支持连接查询。您可以在客户端进行聚合或运行新查询 对于你的第一个问题:我一直在做的是在Kibana中进行可视化(在你的情况下使用subbucket术语聚合)并查看它发送的查询(你可以使用可视化底部的小箭头图标来获得它)。它可能并不总是100%准确,但它开始。