ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
1. 定制dynamic策略 > true:遇到陌生字段,就进行dynamic mapping > false:遇到陌生字段,就忽略 > strict:遇到陌生字段,就报错 ~~~ PUT /my_index { "mappings": { "my_type": { "dynamic": "strict", # 插入不存在的字段,报错 "properties": { "title": { "type": "text" }, "address": { "type": "object", "dynamic": "true" # 遇到不存在的字段,自动映射 } } } } } ~~~ ~~~ PUT /my_index/my_type/1 { "title": "my article", "content": "this is my article", "address": { "province": "guangdong", "city": "guangzhou" } } ~~~ 报错:因为插入了不存在的字段 ~~~ { "error": { "root_cause": [ { "type": "strict_dynamic_mapping_exception", "reason": "mapping set to strict, dynamic introduction of [content] within [my_type] is not allowed" } ], "type": "strict_dynamic_mapping_exception", "reason": "mapping set to strict, dynamic introduction of [content] within [my_type] is not allowed" }, "status": 400 } ~~~ 因为address设置"dynamic": "true" 允许插入不存在的字段,并自动mapping,插入成功 ~~~ PUT /my_index/my_type/1 { "title": "my article", "address": { "province": "guangdong", "city": "guangzhou" } } ~~~ ~~~ GET /my_index/_mapping/my_type { "my_index": { "mappings": { "my_type": { "dynamic": "strict", # 整个type的dynamic:strict,不允许插入不存在的字段 "properties": { "address": { "dynamic": "true", # address的dynamic为true,所以address字段中允许插入新的字段 "properties": { "city": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "province": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }, "title": { "type": "text" } } } } } } ~~~ 2. 定制dynamic mapping策略 (1)date_detection > 默认会按照一定格式识别date,比如yyyy-MM-dd。但是如果某个field先过来一个2017-01-01的值,就会被自动dynamic mapping成date,后面如果再来一个"hello world"之类的值,就会报错。可以手动关闭某个type的date_detection,如果有需要,自己手动指定某个field为date类型。 ~~~ PUT /my_index/_mapping/my_type { "date_detection": false } ~~~ (2)定制自己的dynamic mapping template(type level) ~~~ PUT /my_index { "mappings": { "my_type": { "dynamic_templates": [ { "en": { "match": "*_en", # 索引下,复合这个模式的field,就用这个模板映射 "match_mapping_type": "string", "mapping": { "type": "string", # 把符合模式的字段映射成string类型 "analyzer": "english" # 把符合模式的字段的分词器设置成english(排除频繁词) } }} ] }}} ~~~ ~~~ PUT /my_index/my_type/1 { "title": "this is my first article" } ~~~ ~~~ PUT /my_index/my_type/2 { "title_en": "this is my first article" } ~~~ ~~~ title没有匹配到任何的dynamic模板,默认就是standard分词器,不会过滤停用词,is会进入倒排索引,用is来搜索是可以搜索到的 title_en匹配到了dynamic模板,就是english分词器,会过滤停用词,is这种停用词就会被过滤掉,用is来搜索就搜索不到了 ~~~ (3)定制自己的default mapping template(index level) ~~~ PUT /my_index { "mappings": { "_default_": { "_all": { "enabled": false } }, "blog": { "_all": { "enabled": true } } } } ~~~