ElasticSearch 6.x动态映射下用copy_to替代_all字段的疑问
在Elasticsearch 6.x动态映射场景下使用copy_to替代_all字段
其实完全不用发愁,动态映射的场景下照样能用copy_to实现类似原_all字段的效果,核心思路是用**动态模板(dynamic templates)**来自动给所有动态生成的字段加上复制规则,不用提前知道字段名。
具体步骤是这样的:
- 先定义一个自定义的“聚合字段”,比如叫
my_all,用来存储所有字段的内容,类型设为text就好,和原_all的作用一致。 - 创建动态模板,匹配所有动态生成的字段(不管字段名、字段类型是什么),自动给它们加上
copy_to: "my_all"的配置。
给你个实际的索引创建示例:
PUT /my_dynamic_index { "mappings": { "_doc": { "dynamic_templates": [ { "auto_copy_to_my_all": { "match": "*", "match_mapping_type": "*", "mapping": { "copy_to": "my_all", "type": "{dynamic_type}" // 保留字段原本的自动映射类型 } } } ], "properties": { "my_all": { "type": "text" } } } } }
这个模板的逻辑很清晰:
match: "*"匹配所有字段名,不管是title、content还是其他动态生成的字段match_mapping_type: "*"匹配所有字段类型,text、keyword、integer这些都覆盖- 每个动态字段都会保留原本的类型,同时自动把内容复制到
my_all里
之后你就可以像原来用_all那样,查询my_all字段来做全文检索了,比如:
GET /my_dynamic_index/_search { "query": { "match": { "my_all": "需要搜索的关键词" } } }
另外还有个小技巧:如果有部分敏感字段或者不需要聚合的字段,你可以用unmatch规则排除它们,比如不想复制以private_开头的字段,只需要修改动态模板:
{ "auto_copy_to_my_all": { "match": "*", "unmatch": "private_*", "match_mapping_type": "*", "mapping": { "copy_to": "my_all", "type": "{dynamic_type}" } } }
这样就完美解决了动态映射下无法提前指定字段的问题,效果和原_all字段几乎一致,还能更灵活地控制哪些字段需要聚合。
内容的提问来源于stack exchange,提问作者Vyacheslav
相关产品推荐
相关产品推荐

