gpt4 book ai didi

Elasticsearch 多重求和聚合

转载 作者:行者123 更新时间:2023-11-29 02:53:07 28 4
gpt4 key购买 nike

我们在每个索引中都有很多文档 (~10 000 000)。但是每个文档都非常小,几乎只包含整数值。

我们需要对所有数字字段求和。

  1. 第一步 - 我们要求提供具有映射的所有可用字段。

示例:

GET INDEX/TYPE/_mapping
  1. 第二步 - 我们使用映射中的字段构建请求。

示例:

GET INDEX/TYPE/_search
{
// SOME FILTERS TO REDUCE THE NUMBER OF DOCUMENTS
"size":0,
"aggs":{
"FIELD 1":{
"sum":{
"field":"FIELD 1"
}
},
"FIELD 2":{
"sum":{
"field":"FIELD 2"
}
},
// ...
"FIELD N":{
"sum":{
"field":"FIELD N"
}
}
}
}

我们的问题是第二次请求执行时间与字段数N成线性

这是 Not Acceptable ,因为这只是总和。因此,我们尝试使用脚本化指标 (groovy) 生成我们自己的聚合。

只有 2 个字段的示例:

// ...
"aggs": {
"test": {
"scripted_metric": {
"init_script": "_agg['t'] = []",
"map_script": "_agg.t.add(doc)",
"combine_script": "res = [:]; res['FIELD 1'] = 0; res['FIELD 2'] = 0; for (t in _agg.t) { res['FIELD 1'] += t.['FIELD 1']; res['FIELD 2'] += t.['FIELD 2']; }; return res",
"reduce_script": "res = [:]; res['FIELD 1'] = 0; res['FIELD 2'] = 0; for (t in _aggs) { res['FIELD 1'] += t.['FIELD 1']; res['FIELD 2'] += t.['FIELD 2']; }; return res"
}
}
}
// ...

但似乎我们在脚本中添加的影响越多,执行它所花费的时间就越多,所以它并没有解决我们的问题。

没有很多例子。

你有什么想法来改进这个脚本的性能吗?或者其他想法?

最佳答案

它如何在亚线性时间内计算出 N 个和,是否存在这样的系统?

1000 万个文档实际上并没有那么多。您的查询需要多长时间,您有多少个分片,CPU 是否达到 100% 的最大值? (我打算在评论中问这些,但还没有 50 个声望)

如果您对所有字段的总和感兴趣,您可以在索引文档时预先计算文档级总和,然后在查询时只取这些值的总和。

您也可以尝试将字段存储为 doc_values看看是否有帮助。尽管文档提到可能会降低 10 - 25% 的性能,但您的内存压力和垃圾收集会更少。

关于Elasticsearch 多重求和聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32519785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com