Elasticsearch字段运算查询:筛选field1-field2>50的文档方法
Elasticsearch 字段差值筛选问题解答
你的查询语句存在兼容性问题:filtered查询在Elasticsearch 2.x版本之后已被弃用,现在官方推荐使用bool查询结合filter子句的方式实现筛选逻辑。
正确的查询语句(适用于Elasticsearch 5.x及以上版本)
{ "query": { "bool": { "filter": { "script": { "script": { "source": "doc['field1'].value - doc['field2'].value > 50", "lang": "painless" } } } } } }
注意事项
- 确保你的Elasticsearch允许使用动态脚本:默认情况下动态脚本可能被禁用,需要在
elasticsearch.yml配置文件中添加或修改以下配置:
修改后需要重启Elasticsearch生效。script.allowed_types: inline script.allowed_contexts: filter - 如果字段存储的是非数值类型(比如字符串格式的数字),需要在脚本中先做类型转换,例如:
"source": "(doc['field1'].value as long) - (doc['field2'].value as long) > 50"
旧版本兼容(Elasticsearch 1.x-2.x)
如果你的集群还在使用较旧的版本,原来的filtered查询可以正常工作,但官方已不再维护该语法,建议尽快升级:
{ "filtered": { "filter": { "script": { "script": "doc['field1'].value - doc['field2'].value > 50" } } } }
内容的提问来源于stack exchange,提问作者klaus
相关产品推荐
相关产品推荐

