当ES在文档中碰到1个之前没见过的字段时,它会利用动态映照来决定该字段的类型,并自动地对该字段添加映照。
有时这正是需要的行动,但有时不是。你也许不知道在以后你的文档中会添加哪些字段,但是你想要它们能够被自动地索引。也许你只是想要疏忽它们。或 - 特别当你将ES当作主要的数据存储使用时 - 大概你会希望这些未知的字段会抛出异常来提示你注意这1问题。
荣幸的是,你可以通过dynamic
设置来控制这1行动,它能够接受以下的选项:
true
:默许值。动态添加字段false
:疏忽新字段strict
:如果碰到陌生字段,抛出异常
dynamic
设置可以适用在根对象上或object
类型的任意字段上。你应当默许地将dynamic
设置为strict
,但是为某个特定的内部对象启用它:
在my_type
对象上如果碰到了未知字段则会抛出1个异常。 在stash
对象上会动态添加新字段。
通过以上的映照,你可以向stash
添加新的可搜索的字段:
但是,如果在顶层对象上试图添加新字段则会失败:
NOTE
将
dynamic
设置为false
其实不会改变_source
字段的内容 -_source
字段依然会保存你索引的全部JSON文档。只不过是陌生的字段将不会被添加到映照中,以致于它不能被搜索到。
如果你知道你需要动态的添加的新字段,那末你或许会启用动态映照。但是有时动态映照的规则又有些不够灵活。荣幸的是,你可以调剂某些设置来让动态映照的规则更加合适你的数据。
date_detection
当ES碰到1个新的字符串字段时,它会检查该字串是不是含有1个可被辨认的日期,比如2014-01-01
。如果存在,那末它会被辨认为1个date
类型的字段。否则会将它作为string
进行添加。
有时这类行动会致使1些问题。如果你想要索引1份这样的文档:
假定这是note
字段第1次被发现,那末根据规则它会被作为date
字段添加。但是如果下1份文档是这样的:
这时候该字段明显不是日期,但是已太迟了。该字段的类型已是日期类型的字段了,因此这会致使1个异常被抛出。
可以通过在根对象上将date_detection
设置为false
来关闭日期检测:
有了以上的映照,1个字符串总是会被当作string
类型。如果你需要1个date
字段,你需要手动地添加它。
NOTE
ES中辨认日期的方法可以通过
dynamic_date_formats
设置改变。
dynamic_templates
通过dynamic_templates
,你可以具有对新字段的动态映照规则具有完全的控制。你设置可以根据字段名称或类型来使用1个不同的映照规则。
每一个模板都有1个名字,可以用来描写这个模板做了甚么。同时它有1个mapping
用来指定具体的映照信息,和最少1个参数(比如match
)用来规定对甚么字段需要使用该模板。
模板的匹配是有顺序的 - 第1个匹配的模板会被使用。比如我们可以为string
字段指定两个模板:
es
:以_es
结尾的字段应当使用spanish
解析器en
:其它所有字段使用english
解析器
我们需要将es
模板放在第1个,由于它相比能够匹配所有字符串字段的en
模板更加具体:
match_mapping_type
允许你只对特定类型的字段使用模板,正如标准动态映照规则那样,比如string
,long
等。
match
参数只会匹配字段名,path_match
参数用于匹配对象中字段的完全路径,比如address.*.name
可以匹配以下字段:
unmatch
和path_unmatch
模式能够用来排除某些字段,没有被排除的字段则会被匹配。
更多的配置选项可以在根对象的参考文档中找到。