在Elasticsearch聚合中做自定义映射的最佳实践



我想通过映射ES doc中的某个字段来进行自定义聚合。

我尝试利用术语聚合脚本。这里有数百个映射所以我必须把它们都放到HashMap中:

GET /myindex/_search
{
"query": {
"match_all": {}
},
"aggs": {
"myagg": {
"terms": {
"script": {
"source": "Map m = new HashMap(); m.put('a', 'A'); m.put('b', 'A'); m.put('bb', 'CC'); ... return m.get(doc['foo.keyword'].value)",
"lang": "painless"
}
}
}
},
"size": 0
}

它很丑,性能很差,即使我使用存储的脚本。我不知道为什么在我的脚本中执行这么多时间。

我还尝试了脚本化的度量聚合。与正常的术语聚合相比,它更好,但仍然很慢。

有没有办法加速映射?(除了运行时字段,因为我的ES版本不支持)

tldr如果有的话,您可以尝试运行时字段,但它们可能也不会很快。这就是Elasticsearch脚本的不幸本质

你最好的选择是ExplodZe上面所说的,并在摄取过程中提前完成这项工作,以使查询时间更快