Elasticsearch中的动态映射

转载自: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允许你只对特定类型的字段使用模板,正如标准动态映射规则那样,比如stringlong等。

match参数只会匹配字段名,path_match参数用于匹配对象中字段的完整路径,比如address.*.name可以匹配如下字段:

{
    "address":
        "city":
            "name": "New York"
        }
    }
}

unmatchpath_unmatch模式能够用来排除某些字段,没有被排除的字段则会被匹配。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值