如何对含空格的Elasticsearch属性名执行聚合操作
解决Elasticsearch中带空格属性名的聚合问题
嘿,我来帮你搞定这个带空格字段的聚合问题!
首先看你的映射结构,detail.attribute下确实有一个名为Operating System的字段,并且包含raw子字段。问题出在你引用这个带空格字段的方式上——Elasticsearch对于包含特殊字符(比如空格)的字段名,需要用特定语法来准确识别。
你之前尝试的detail.attribute['Operating System'].raw其实是可行的写法,可能是语法细节上出了小问题?另外还有一种更直观的写法,用转义双引号包裹带空格的字段名:
正确的字段引用方式
你可以二选一:
- 方括号+单引号形式:
"field": "detail.attribute['Operating System'].raw"
- 转义双引号形式:
"field": "detail.attribute.\"Operating System\".raw"
修改后的完整查询体
把你的聚合查询里的Operating_System部分替换成正确的字段引用,完整查询如下:
{ "size": 0, "aggs": { "categoryId": { "filter": { "bool": { "filter": [ { "term": { "title.list": "iphone" } } ] } }, "aggs": { "results": { "terms": { "field": "category.l3.id", "size": 4 }, "aggs": { "categoryName": { "terms": { "field": "category.l3.id.keyword", "size": 1 } }, "Operating_System": { "terms": { "field": "detail.attribute['Operating System'].raw", "size": 9 } } } } } } } }
为什么之前的写法不行?
当字段名包含空格时,Elasticsearch默认会把空格后的部分当成新的层级。直接写detail.attribute.Operating System.raw会被解析成detail.attribute.Operating加上一个不存在的System.raw字段,自然会报错。用方括号+单引号或者转义双引号的方式,能明确告诉ElasticsearchOperating System是一个完整的字段名,不会被拆分。
内容的提问来源于stack exchange,提问作者anoop chandran
相关产品推荐
相关产品推荐

