Elasticsearch无映射过滤需求:动态字段类型变更映射问题咨询
Elasticsearch 忽略映射冲突仍保留过滤能力的方案
用动态模板(
dynamic_templates)实现多字段兼容
提前配置动态模板,让ES为可能变更类型的字段自动生成多类型子字段。比如给数值字段同时生成数值类型和文本类型的子字段,后续不管存入数值还是文本,都能通过对应的子字段做过滤,避免映射错误。示例配置:{ "mappings": { "dynamic_templates": [ { "num_to_text": { "match_mapping_type": "float", "mapping": { "type": "float", "fields": { "text": { "type": "text", "analyzer": "standard" } } } } }, { "obj_to_text": { "match_mapping_type": "object", "mapping": { "type": "object", "fields": { "flat_text": { "type": "text", "ignore_above": 2048 } } } } } ] } }比如原float类型字段改成文本后,就用
field_name.text做文本过滤,原字段仍可处理数值过滤。启用
ignore_malformed参数跳过非法数据
对数值、日期这类字段,在映射里设置ignore_malformed: true,存入不符合类型的数据时,ES会忽略错误直接存储,同时保留原字段的过滤能力(仅对合法类型的数据生效)。但这个参数不支持object转text的场景。示例:{ "mappings": { "properties": { "count": { "type": "float", "ignore_malformed": true } } } }比如
count字段存文本值不会报错,合法的数值仍能做范围过滤,文本值仅存在_source中不参与索引。用
copy_to字段做统一过滤入口
定义一个通用的过滤字段,把所有可能变更类型的字段都通过copy_to复制到这个字段,设置其为text+keyword组合类型。不管原字段类型怎么变,新数据都会同步到这个通用字段,确保过滤功能不受影响。示例:{ "mappings": { "properties": { "dynamic_field": { "type": "object", "copy_to": "unified_filter" }, "unified_filter": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } } }后续把
dynamic_field改成text类型时,新数据依然会复制到unified_filter,直接用这个字段做文本或精确匹配过滤即可。
内容的提问来源于stack exchange,提问作者Sohayb Saleh
相关产品推荐
相关产品推荐

