Elasticsearch文档缺失PHONE_NUMBER字段时返回预设默认值的方法
解决方案:为Elasticsearch缺失字段设置查询默认值
直接指定_source无法为缺失字段补充默认值,因为_source返回的是文档原始存储的数据。要实现需求,可通过以下两种方式:
方法一:使用脚本字段(Script Fields)
在查询中定义脚本字段,通过脚本判断字段是否存在,不存在则返回预设默认值。修改后的查询语句如下:
{ "query": { "bool": { "must": [ { "terms": { "LOCATION_ID": ["5001"] } } ] } }, "script_fields": { "USER_ID": { "script": { "source": "doc['USER_ID'].value" } }, "PHONE_NUMBER": { "script": { "source": "doc.containsKey('PHONE_NUMBER') ? doc['PHONE_NUMBER'].value : 9876543210" } } }, "from": 0, "size": 2000 }
说明:
- 用
script_fields替代_source,自定义返回的字段内容 - 脚本中通过
doc.containsKey('PHONE_NUMBER')判断字段是否存在,存在则取原始值,否则返回默认值9876543210 - 若字段可能为
null而非完全缺失,可调整判断逻辑为doc['PHONE_NUMBER'].size() > 0
方法二:使用运行时字段(Runtime Fields)
如果需要长期复用这个逻辑,可在索引映射中定义运行时字段;也可在查询时临时定义,示例如下:
查询时临时定义运行时字段
{ "runtime_mappings": { "PHONE_NUMBER_WITH_DEFAULT": { "type": "long", "script": { "source": "emit(doc.containsKey('PHONE_NUMBER') ? doc['PHONE_NUMBER'].value : 9876543210)" } } }, "_source": ["USER_ID"], "query": { "bool": { "must": [ { "terms": { "LOCATION_ID": ["5001"] } } ] } }, "fields": ["USER_ID", "PHONE_NUMBER_WITH_DEFAULT"], "from": 0, "size": 2000 }
说明:
runtime_mappings中定义临时运行时字段PHONE_NUMBER_WITH_DEFAULT,处理默认值逻辑- 通过
fields指定返回原始的USER_ID和自定义的运行时字段 - 若需长期使用,可将运行时字段定义到索引的映射中,无需每次查询重复定义
内容的提问来源于stack exchange,提问作者Divyansh Rajput
相关产品推荐
相关产品推荐

