如何在ElasticSearch中同时获取脚本字段与原始字段?
解决ElasticSearch同时返回原始字段与计算字段的问题
这问题我之前也踩过坑!默认情况下,当你只使用script_fields时,ElasticSearch只会返回你定义的计算字段,不会自动带出原始字段。要同时拿到原始字段和计算值,有两个简单好用的办法:
方法一:通过_source返回全部原始字段
如果你需要文档的所有原始字段,只需要在查询里加上"_source": true即可,它会把原始字段放在_source节点下,计算字段依然在fields里。示例查询如下:
{ "query": { "match": { "userId": "1161851" } }, "_source": true, "script_fields": { "additionalParameter": { "script": { "lang": "painless", "source": "doc['value'] * factor", "params": { "factor": 2.0 } } } } }
返回结果会包含:
_source:里面有你原始的userId、value等所有字段fields:里面是计算出来的additionalParameter
如果你只需要部分原始字段,可以把true换成字段数组,比如"_source": ["userId", "value"],这样只会返回指定的原始字段,更节省带宽。
方法二:通过fields参数混合原始字段与计算字段
如果你希望把原始字段和计算字段都放在fields节点下返回,可以用fields参数列出需要的原始字段,再配合script_fields。示例:
{ "query": { "match": { "userId": "1161851" } }, "fields": ["userId", "value"], "script_fields": { "additionalParameter": { "script": { "lang": "painless", "source": "doc['value'] * factor", "params": { "factor": 2.0 } } } } }
这种方式返回的fields里会同时包含userId、value和additionalParameter,所有字段都在同一个节点下,方便统一处理。
为什么之前只返回计算字段?
因为ElasticSearch的默认逻辑是:当你仅指定script_fields时,它认为你只需要计算后的字段,不会主动返回原始内容。必须通过_source或fields明确声明你需要的原始字段,才能一起返回。
内容的提问来源于stack exchange,提问作者Niko Gamulin
相关产品推荐
相关产品推荐

