在 Elasticsearch 聚合中进行自定义映射的最佳实践
Best practice to do customized mapping in Elasticsearch aggregation
我想通过映射ES doc中的某个字段来进行自定义聚合
我尝试利用 terms aggregation script。有数百个映射,所以我必须将它们全部放入 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
}
它很难看,而且即使我使用存储的脚本,性能也很差。不知道为什么在我的脚本中执行会花费这么多时间。
我也试过scripted metric aggregation。与普通术语聚合相比,它更好但仍然很慢。
有什么方法可以加速映射吗? (除了runtime fields因为我的ES版本不支持)
tldr 如果有运行时字段,您可以尝试使用它们,但它们也可能不会很快。这就是此时在 Elasticsearch 中编写脚本的不幸本质
你最好的选择是 ExplodZe 上面所说的,并在摄取过程中提前完成这项工作,以加快查询速度
我想通过映射ES doc中的某个字段来进行自定义聚合
我尝试利用 terms aggregation script。有数百个映射,所以我必须将它们全部放入 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
}
它很难看,而且即使我使用存储的脚本,性能也很差。不知道为什么在我的脚本中执行会花费这么多时间。
我也试过scripted metric aggregation。与普通术语聚合相比,它更好但仍然很慢。
有什么方法可以加速映射吗? (除了runtime fields因为我的ES版本不支持)
tldr 如果有运行时字段,您可以尝试使用它们,但它们也可能不会很快。这就是此时在 Elasticsearch 中编写脚本的不幸本质
你最好的选择是 ExplodZe 上面所说的,并在摄取过程中提前完成这项工作,以加快查询速度