如何在不返回Elasticsearch

时间:2016-06-28 16:36:21

标签: elasticsearch elasticsearch-aggregation

我正在使用Elasticsearch 2.3,我正在尝试使用管道聚合执行两步计算。 我只对管道聚合的最终结果感兴趣,但Elasticsearch会返回所有存储桶信息。

由于我有大量的桶(数十或数亿),这是令人望而却步的。不幸的是,我找不到告诉Es不要返回所有这些信息的方法。

这是一个玩具示例。我的索引test-index的文档类型为objobj有两个字段keyvalues

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 100,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 20,
  "key": "foo"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 50,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 60,
  "key": "bar"
}'

curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
  "value": 70,
  "key": "bar"
}'

我想获得具有相同key s的valueobj的最小key的平均值(超过所有curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{ "size": 0, "query": { "match_all": {} }, "aggregations": { "key_aggregates": { "terms": { "field": "key", "size": 0 }, "aggs": { "min_value": { "min": { "field": "value" } } } }, "avg_min_value": { "avg_bucket": { "buckets_path": "key_aggregates>min_value" } } } }' s)。 平均最小值。

Elasticsearch允许我这样做:

{
  "took": 21,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": [

    ]
  },
  "aggregations": {
    "key_aggregates": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "bar",
          "doc_count": 2,
          "min_value": {
            "value": 50
          }
        },
        {
          "key": "foo",
          "doc_count": 2,
          "min_value": {
            "value": 20
          }
        }
      ]
    },
    "avg_min_value": {
      "value": 35
    }
  }
}

但是这个查询返回每个桶的最小值,虽然我不需要它:

"buckets": [...]

有没有办法摆脱avg_min_value内的所有信息?我只对key感兴趣。

在这个玩具示例中,这似乎不是问题,但是当不同match_all的数量不大(数十或数亿)时,查询响应非常大,我想修剪它。

有没有办法用Elasticsearch做到这一点?或者我的数据建模错误了吗?

注意:每个密钥预先汇总我的数据是不可接受的,因为我的查询的size部分可能会被复杂和未知的过滤器所取代。

NB2:我的terms聚合中将<ul> <li>list 1</li> <li>list 2 <source lang="sql">select * from table1 select * from table2</source> </li> </ul> 更改为非负数是不可接受的,因为它会改变结果。

1 个答案:

答案 0 :(得分:11)

我遇到了同样的问题,经过相当多的研究后,我找到了一个解决方案,并认为我会在这里分享。

您可以使用Response Filtering功能过滤您想要接收的答案部分。

您应该可以通过将查询参数filter_path=aggregations.avg_min_value添加到搜索网址来实现您的目标。在示例中,它应该类似于:

curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search?filter_path=aggregations.avg_min_value' -d '{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggregations": {
    "key_aggregates": {
      "terms": {
        "field": "key",
        "size": 0
      },
      "aggs": {
        "min_value": {
          "min": {
            "field": "value"
          }
        }
      }
    },
    "avg_min_value": {
      "avg_bucket": {
        "buckets_path": "key_aggregates>min_value"
      }
    }
  }
}'

PS:如果你找到另一种解决方案,你介意在这里分享吗?谢谢!