定制dynamic策略
true: 遇到陌生字段,就进行dynamic mapping
false: 遇到陌生字段,就忽略
strict: 遇到陌生字段,就报错
示例
我们现在来新建一个index.
1 | PUT /my_index |
1处,我们设置了这个my_type的dynamic是strict,就是遇到陌生的字段,就报错
2处,设置了address这个object类型的filed的dynamic是true, 遇到陌生字段就进行dynamic mapping
先来放一条数据进去
1 | PUT /my_index/my_type/1 |
1处,content这个field 我们创建索引时,并没有设置设置这个content, dynamic是strict,遇到陌生字段应该报错
2,3处的province和city,我们也没有设置, address的dynamic策略应该是遇到陌生字段就进行dynamic mapping
运行上面代码,返回值:
1 | { |
报错了因为我们在my_type中设置的dynamic是strict
然后把content这个field删掉
1 | PUT /my_index/my_type/1 |
执行后,添加成功. 然后我们来查询一下这个type的mapping
1 | GET /my_index/_mapping/my_type |
返回值:
1 | { |
可以看到address中的province和city这两个字段已经被自动dynamic mapping了
定制dynamic mapping策略
date_detection
es会默认按照一定的格式识别date类型,比如yyyy-MM-dd,但是如果某个field先过来一个2018-01-01的值,就会被自动dynamic mapping 成 date类型,后面如果再来一个”hello word”之类的值,就会报错.
我们可以手动关闭某个type的date_detection,如果有需要,自己手动指定某个field为date类型.
1 | PUT /index/_mapping/type |
定制自己的dynamic mapping template (type级别)
首先我们需要在建索引的时候添加一个模板.
1 | PUT /my_index |
上面这段代码就是说 field名称是_en结尾的话,就是string类型的,分词器是english分词器
我们来添加两条数据,然后查询测试一下
1 | PUT /my_index/my_type/1 |
分别用title 和 title_en去匹配 is这个词.会发现 用title_en是匹配不到的
title没有匹配到任何的dynamic模板,默认就是standard分词器,不会过滤停用词,is会进入倒排索引,用is来搜索是可以搜索到的
title_en匹配到了dynamic模板,就是english分词器,会过滤停用词,is这种停用词就会被过滤掉,用is来搜索就搜索不到了
定制自己的dynamic mapping template (index级别)
例:
1 | PUT /my_index |
就是说默认的type的_all是禁用的, blog这个type的_all是启用的.