求助:如何将Elasticsearch字段值转小写后实现聚合?
解决Elasticsearch聚合时统一字段大小写的问题
一、修复你的Painless脚本错误
你当前的脚本有两个问题导致无法正常工作:
- 直接调用
doc['response.keyword'].toLowercase()不对,doc['response.keyword']是字段对象,需要用.value获取字符串内容 - Painless里转小写的方法是
toLowerCase()(驼峰写法,你写的toLowercase()拼写错误)
修正后的聚合部分脚本如下:
"aggregations": { "FieldAggregationSpend": { "terms": { "field": "spend.keyword", "size": 500, "min_doc_count": 1, "shard_min_doc_count": 0, "show_term_doc_count_error": false, "order": [ { "_count": "desc" }, { "_key": "asc" } ] }, "aggregations": { "Field": { "terms": { "script": { "source": "def sentiment = doc['response.keyword'].value.toLowerCase(); return sentiment;", "lang": "painless" }, "size": 500, "min_doc_count": 1, "shard_min_doc_count": 0, "show_term_doc_count_error": false, "order": [ { "_count": "desc" }, { "_key": "asc" } ] } } } } }
用这个脚本查询后,就能把"Good"、"good"、"gOOd"都聚合到key: good的桶里。
二、更高效的替代方案:Runtime Field
如果你的数据量较大,脚本聚合的性能可能不够理想,推荐用Runtime Field——不需要重新索引已有数据,直接在查询时定义一个转小写的虚拟字段,再基于这个字段聚合:
完整查询示例:
GET index/_search { "size": 100, "query": { "bool": { "must_not": [ { "term": { "testData": { "value": true, "boost": 1.0 } } } ], "adjust_pure_negative": true, "boost": 1.0 } }, "sort": [ { "timestamp": { "order": "desc" } } ], "runtime_mappings": { "response_lowercase": { "type": "keyword", "script": "emit(doc['response.keyword'].value.toLowerCase())" } }, "aggregations": { "FieldAggregationSpend": { "terms": { "field": "spend.keyword", "size": 500, "min_doc_count": 1, "shard_min_doc_count": 0, "show_term_doc_count_error": false, "order": [ { "_count": "desc" }, { "_key": "asc" } ] }, "aggregations": { "Field": { "terms": { "field": "response_lowercase", "size": 500, "min_doc_count": 1, "shard_min_doc_count": 0, "show_term_doc_count_error": false, "order": [ { "_count": "desc" }, { "_key": "asc" } ] } } } } } }
Runtime Field会在查询时动态生成转小写后的字段,性能比脚本聚合更优,适合频繁使用这类聚合的场景。
关于Analyzer的说明
如果不想用脚本或Runtime Field,也可以给response字段添加一个子字段(比如response.lowercase),用lowercase analyzer处理,但需要更新索引映射后重新索引数据。因为你提到已有数据不想改动,所以前面两种方案更适合你。
内容的提问来源于stack exchange,提问作者Shufan Xing
相关产品推荐
相关产品推荐

