当前位置: 首页 > 面试题库 >

如何在Elasticsearch中执行管道聚合而不返回所有存储桶

洪德寿
2023-03-14
问题内容

我正在使用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"
}'

我想获得具有s 的s key的最小值的平均值(在所有s上)。平均值的最小值。value``obj``key

Elasticsearch允许我这样做:

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"
      }
    }
  }
}'

但是此查询返回每个存储桶的最小值,尽管我不需要它:

{
  "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

在这个玩具示例中,这似乎不是问题,但是当不同的keys 的数量不大(数千万或数亿)时,查询响应会过大,因此我希望对此进行修剪。

有没有办法用Elasticsearch做到这一点?还是我的数据建模错误?

注意:按键预聚合我的数据是不可接受的,因为match_all我的查询部分可能被复杂且未知的过滤器所代替。

NB2:size在我的terms汇总中更改为非负数是不可接受的,因为这会更改结果。


问题答案:

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

您可以使用“
响应过滤”功能来过滤要接收的部分答案。

通过将查询参数添加filter_path=aggregations.avg_min_value到搜索URL,您应该能够实现所需的目标。在示例情况下,它应类似于以下内容:

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:如果您找到其他解决方案,您愿意在这里分享吗?谢谢!



 类似资料:
  • 问题内容: 我正在使用ES 1.4。当我执行聚合时,结果也会返回hits数组。有没有办法只返回聚合? 问题答案: 有可能的。您应该在网址中键入其他参数( ?search_type = count )。在这里看看:http : //www.elasticsearch.org/guide/en/elasticsearch/reference/current/search- aggregations.h

  • 此处为elasticsearch新用户,但存在术语聚合问题。我为187份文档编制了索引,其中包含“名称”、“主机”、“风险”等字段。字段风险有4个唯一值(“关键”、“高”、“中”、“低”、“信息”),我正在运行这样的术语聚合: 我希望得到一个结果,说明我有x个临界值,x个高值等等。问题是,我没有得到返回的桶。 我的Elasticsearch版本是7.12.0有什么想法吗 > 编辑:这是映射: 以下

  • 问题内容: 我正在尝试列出聚合中的所有存储桶,但似乎只显示了前10个。 我的搜索: 返回值: 对于此聚合,我有10个以上的键。在此示例中,我将有145个键,并且我希望每个键的计数。桶上有分页吗?我可以全部拿走吗? 我正在使用Elasticsearch 1.1.0 问题答案: size参数应该是术语查询示例的参数: 如文档中所述,仅适用于1.1.0版及更高版本 编辑 根据@PhaedrusTheGr

  • 问题内容: ES版本:1.5(Amazon Elasticsearch) 我的目标:在某个字段上具有重复数据删除功能的搜索结果。我目前正在对聚合进行一些研究,以解决重复数据删除问题。因此,我的结果是一个带有1个大小的存储桶的列表存储桶。但是,我找不到订购存储桶列表的方法。 当前查询: 结果: 我想看到第二个存储桶,其中max_score = 68.78424为第一个。这可能吗? 如果不建议使用聚合

  • 问题内容: 我需要计算管道聚合返回的结果集中的存储桶数。问题是我的查询在这里使用脚本选择器: 返回类似这样的内容: 在该键下,我可以看到一个满足我条件的访问者列表(由标识的每个访问者都必须在索引中恰好有三个文档),但这不是很有用,因为它可以处理成千上万的访问者。我正在使用PHP处理结果,从理论上讲,它可以计算结果集,但是对于大量的访问者来说,这并不是最好的主意。有没有一种方法可以仅在和旁边输出有效

  • 但邮差回信说: 知道为什么或如何进一步调试它吗?Spring data-elasticsearch在做我不明白的事情吗? 我应该期待这样的事情: