如何查询Elasticsearch中double类型字段值为空字符串的文档
Elasticsearch查询double类型字段为空字符串的方案
前提说明
你能写入空字符串到double类型字段,说明该字段的索引映射中开启了ignore_malformed: true配置,ES会自动忽略类型不匹配的写入错误,保留原始的非法值。你之前用must_not+exists的方案无法区分「字段值为空字符串」和「字段不存在」两类数据,原因是exists查询只要字段有实际值(包括空字符串这类非法值)就返回true,反向筛选后会同时命中无字段的文档。
可行查询方案
方案1:脚本查询(兼容所有ES版本)
直接读取_source中的原始字段值做判断,不会触发数值类型转换,避免抛出number_format_exception:
GET /你的索引名/_search { "query": { "bool": { "filter": [ { "exists": { "field": "你的double字段名" } }, { "script": { "script": "doc['你的double字段名'].size() == 0 && params._source['你的double字段名'] == ''" } } ] } } }
说明:先加exists条件排除字段不存在的文档,再通过脚本判断原始值是否为空字符串。
方案2:带ignore_malformed参数的term查询(ES 7.10+版本支持)
新版ES的term查询支持传入ignore_malformed参数,跳过类型转换错误的校验,直接匹配值:
GET /你的索引名/_search { "query": { "term": { "你的double字段名": { "value": "", "ignore_malformed": true } } } }
这个写法会自动过滤掉字段不存在的文档,仅返回字段值为空字符串的结果。
内容的提问来源于stack exchange,提问作者iluvfugu
相关产品推荐
相关产品推荐

