【问题标题】:Elastic search query for getting array of values用于获取值数组的弹性搜索查询
【发布时间】:2020-01-28 11:23:59
【问题描述】:

您写了一个查询来获取 Elastic 搜索中某个位置的值的平均值 弹性搜索负载:“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"
          }
        }
      }
    }
  }
}

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

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

【问题讨论】:

  • 我可以帮你更清楚一点
  • 不幸的是,您的示例并没有使您的问题更清楚(数组 [20,10,40,60,8] 的平均值是 240?)。此外,您可以按术语从聚合中删除过滤器,因为您已经在查询中进行过滤
  • @glenacota 我已经更新了我的查询,请看一下,我想要计算 avg 的元素数组

标签: java elasticsearch kibana elasticsearch-aggregation


【解决方案1】:

我认为您无法在查询响应中获得格式为 [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
    }
  }

【讨论】:

  • 我面临的问题是,当我按照你说的做时,我得到所有值的平均值,无论它与条件 A 还是条件 B 相关。此外,存储桶由值组成与条件 A 和条件 B 相关
  • 你确定吗?这不是我对该查询的期望,也不是我从测试中得到的。聚合对指定查询返回的数据进行操作 (elastic.co/guide/en/elasticsearch/reference/current/…)
  • 是的,我很确定。原始查询由另一个匹配查询和范围查询组成
  • 我想我们需要查看您的原始查询,然后
  • 您的新查询以及上面的 cmets 与您的原始问题(即如何显示用于计算平均值的值数组)有很大不同。虽然我的回答是指您最初的问题,但它仍然可以适应您的更新。为了演示它并确保我们在同一页面上,我创建了这个要点以适应您最近的更新:gist.github.com/glenacota/47a0f9a563c4028032c0debbc1d557df
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
相关资源
最近更新 更多