弹性搜索查询以获取值数组

时间:2020-01-28 11:23:59

标签: java elasticsearch kibana elasticsearch-aggregation

您好,我写了一个查询来获取弹性搜索中某个位置的平均值 弹性搜索有效负载:“ userData”:[{“ sub”:1234,“ value”:678,“ condition”:“ A”},{“ sub”:1234,“ value”:678,“ condition” :“ B”}]

{ 
  "aggs": { 
    "student_data": { 
      "date_histogram": { 
        "field":"@timestamp",
        "calendar_interval":"minute"
      },
      "aggs": { 
        "user_avg": { 
          "avg": { 
            "field":"value"
          }
        }
      }
    }
  }
}

我想要的是获取返回avg值的元素数组。 例如,如果基于条件“ A”的平均值为42,且值为{20,10,40,60,80}

在输出中需要一个可提供[20,10,40,60,80]数组的字段

1 个答案:

答案 0 :(得分:0)

我认为您无法在查询响应中获得格式为[20, 10, 40, 60, 80]的数组。我想不出一种通过使用聚合或脚本字段来获取它的方法。不过,您可以轻松地(1)从指定聚合和过滤器逻辑的同一查询中获取该信息;然后,(2)对查询响应进行后处理,以按照您喜欢的方式对它们进行格式化,以收集用于计算平均值的所有value值。对响应进行后处理的方式取决于用于将查询发送到Elasticsearch的客户端/脚本。

例如,您可以输出用于计算平均值的值作为查询结果。

{
  "size": 100,           <-- adjust this upper limit to your use case 
  "_source": "value",    <-- include only the `value` field in the response
  "query": {
    "match": {
      "condition": "A"
    }
  },
  "aggs": {
    "user_avg": {
      "avg": {
        "field": "value"
      }
    }
  }
}

或者您可以通过使用术语汇总以更紧凑的方式输出用于计算平均值的值。

{
  "size": 0,
  "_source": "value",
  "query": {
    "match": {
      "condition": "A"
    }
  },
  "aggs": {
    "group_by_values": {
      "terms": {
        "field": "value",
        "size": 100 .       <-- adjust this upper limit to your use case 
      }
    },
    "user_avg": {
      "avg": {
        "field": "value"
      }
    }
  }
}

后者的结果将类似于:

"aggregations" : {
    "array_of_values" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 50,
          "doc_count" : 2
        },
        {
          "key" : 60,
          "doc_count" : 1
        },
        {
          "key" : 100,
          "doc_count" : 1
        }
      ]
    },
    "user_avg" : {
      "value" : 65.0
    }
  }