在 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 上面所说的,并在摄取过程中提前完成这项工作,以加快查询速度