Elasticsearch中的动态映射
来源:互联网 发布:安全防护软件排行 编辑:程序博客网 时间:2024/05/29 03:57
转载自:http://blog.csdn.net/dm_vincent/article/details/41593987
当ES在文档中碰到一个以前没有见过的字段的时候,它会利用动态映射来决定改字段的类型,并且自动地对该字段添加映射。
有时候这正是需要的行为,但有时候不是。或者你希望这些未知的字段会抛出异常来提醒你注意这个问题。
对于动态映射可以通过dynamic来进行控制,它接受一下选项:
<1>true:默认值。动态添加字段。
<2>false:忽略新字段
<3>strict:如果碰到陌生的字段,抛出异常。
dynamic可以设置使用在根对象或者object类型的任意字段上。你应该默认的将dynamic设置为strict,但是为某个特定的内部对象启用它。
PUT /my_index{ "mappings": { "my_type": { "dynamic": "strict", "properties": { "title": { "type": "string"}, "stash": { "type": "object", "dynamic": true } } } }}
以上代码的意思是:在my_type对象上如果碰到了位置字段会抛出一个异常。在stash对象上会动态添加新字段。
例子:
PUT /my_index/my_type/1{ "title": "This doc adds a new field", "stash": { "new_field": "Success!" }}
PUT /my_index/my_type/1{ "title": "This throws a StrictDynamicMappingException", "new_field": "Fail!"}
自定义动态映射:
如果你知道你需要动态的添加新的字段,那么你也许会启用动态映射。然而有时动态映射的规则又有些不灵活。幸运的是,你可以调整某些设置来让动态映射的规则更加适合你的数据。
date_detection
当ES碰到一个新的字符串的字段的时候,它会检查该字段是否含有一个可以被识别的日期,比如2010-01-01。如果存在,那么它会被识别为一个date类型的字段。否则会将它作为string进行添加。
有时这种行为会导致一些问题。如果你想要索引一份这样的文档:
{ "note": "2014-01-01" }
假设这是note
字段第一次被发现,那么根据规则它会被作为date
字段添加。但是如果下一份文档是这样的:
{ "note": "Logged out" }
这时该字段显然不是日期,但是已经太迟了。该字段的类型已经是日期类型的字段了,因此这会导致一个异常被抛出。
可以通过在根对象上将date_detection
设置为false
来关闭日期检测:
PUT /my_index{ "mappings": { "my_type": { "date_detection": false } }}
有了以上的映射,一个字符串总是会被当做string
类型。如果你需要一个date
字段,你需要手动地添加它。
dyanmic_templates
通过dynamic_template,你可以对新字段的动态映射规则拥有完全的控制。
每个模板都有一个名字,可以用来描述这个模板做了什么。同时它有一个mapping
用来指定具体的映射信息,和至少一个参数(比如match
)用来规定对于什么字段需要使用该模板。
模板的匹配是有顺序的 - 第一个匹配的模板会被使用。比如我们可以为string
字段指定两个模板:
es
:以_es
结尾的字段应该使用spanish
解析器en
:其它所有字段使用english
解析器
我们需要将es
模板放在第一个,因为它相比能够匹配所有字符串字段的en
模板更加具体:
PUT /my_index{ "mappings": { "my_type": { "dynamic_templates": [ { "es": { "match": "*_es", "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "spanish" } }}, { "en": { "match": "*", "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "english" } }} ]}}}
match_mapping_type
允许你只对特定类型的字段使用模板,正如标准动态映射规则那样,比如string
,long
等。
match
参数只会匹配字段名,path_match
参数用于匹配对象中字段的完整路径,比如address.*.name
可以匹配如下字段:
{ "address": "city": "name": "New York" } }}
unmatch
和path_unmatch
模式能够用来排除某些字段,没有被排除的字段则会被匹配。
- Elasticsearch中的动态映射
- elasticsearch-动态映射
- elasticsearch-自定义动态映射
- elasticsearch-动态映射
- [Elasticsearch] 索引管理 (四) - 动态映射
- Elasticsearch - 自动检测及动态映射Dynamic Mapping
- Elasticsearch 动态映射——自动检测
- elasticsearch的object类型和动态映射
- ElasticSearch映射
- elasticsearch映射
- elasticsearch映射
- elasticsearch映射
- Elasticsearch(映射)
- elasticsearch中的mapping映射配置与查询典型案例
- Elasticsearch中的默认映射,重索引和索引别名
- wince bsp中的g_oalAddressTable表----静态映射/动态映射
- ElasticSearch映射和分析
- [ElasticSearch]映射(Mapping)
- Volley(三) 自定义Request
- Matlab中URL网络图象显示
- Android属性动画应用——菜单以散开的方式弹出
- java中的多态
- 关于in 和 exist 的区别-------------近期优化sql 语句的时候再次碰到
- Elasticsearch中的动态映射
- 放开了谈论
- 通过新浪天气API获取天气
- mongdb3.0用户验证问题
- 题目1091:棋盘游戏 -- DFS BFS
- tornado环境安装
- Excel小技巧,记下来防止忘记
- linux设备驱动归纳总结(二):模块的相关基础概念
- Spring @Resource、@Autowired、@Qualifier的注解注入及区别