Elasticsearch - 自动检测及动态映射Dynamic Mapping

一、自动映射:

ES通过查看定义某文档的json格式就能猜测到文档结构,我们称之为自动映射,在开发过程中需要注意这些特性。

字段自动检测

在某个字段第一次出现时,如果之前没有定义过映射,ES会自动检测它可能满足的类型,然后创建对应的映射。


JSON数据


ES中的数据类型


null


不会添加字段


true or false


boolean


floating point number


double


integer


long


object


object


array


依赖于第一个非null得值


string


如果通过了date检测,则为date

如果通过了numeric检测,则为Number

上面就是类型自动检测的结果,除了上面列出的基本类型,其他的高级的类型比如geo,ip就需要手动指定了。

日期自动检测

日期自动检测,即date_detection是默认开启的,因此只要符合默认的日期格式,就可以自动创建成date类型

日期的格式为:

[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss || yyyy/MM/dd"]

例如:

$ curl -XPUT localhost:9200/test/test/1 -d ‘{"create":"2015/11/11"}‘
{"_index":"test","_type":"test","_id":"1","_version":1,"created":true}

$ curl -XGET localhost:9200/test/_mapping?pretty
{
  "test" : {
    "mappings" : {
      "test" : {
        "properties" : {
          "create" : {
            "type" : "date",
            "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd"
          }
        }
      }
    }
  }
}

可以通过修改dynamic_date_formats 修改日期格式:

PUT my_index
{
    "mappings":{
        “my_type":{"dynamic_date_formats":["MM/dd/yyyy"]}
    }
}

PUT my_index/my_type/1{"create_date":"09/25/2015"}

数字自动检测

数字自动检测,即numeric_detection默认是关闭的。因此需要手动打开:

PUT my_index
{"mappings":{"my_type":{"numeric_detection":true}}}

当执行索引操作时,如果符合float型,就会自动创建为double,如果符合int型,ES默认创建为long

可能通过类似curl -XPUT localhost:9200/test1/test1/_mapping?pretty查询自动生成的映射。

二、动态映射:

ES中有一个非常重要的特性——动态映射,即索引文档前不需要创建索引、类型等信息,在索引的同时会自动完成索引、类型、映射的创建。那么什么是映射呢?映射就是描述字段的类型、如何进行分析、如何进行索引等内容。

当ES在文档中碰到一个以前没见过的字段时,它会利用动态映射来决定该字段的类型,并自动地对该字段添加映射。

有时这正是需要的行为,但有时不是,需要留意。你或许不知道在以后你的文档中会添加哪些字段,但是你想要它们能够被自动地索引。或许你只是想要忽略它们。或者,尤其当你将ES当做主要的数据存储使用时,大概你会希望这些未知的字段会抛出异常来提醒你注意这一问题。

幸运的是,你可以通过dynamic设置来控制这一行为,它能够接受以下的选项:

  • true:默认值。动态添加字段
  • false:忽略新字段
  • 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对象上会动态添加新字段。

通过以上的映射,你可以向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!"
}

NOTE

dynamic设置为false并不会改变_source字段的内容,_source字段仍然会保存你索引的整个JSON文档。只不过是陌生的字段将不会被添加到映射中,以至于它不能被搜索到。

自定义动态映射

如果你知道你需要动态的添加的新字段,那么你也许会启用动态映射。然而有时动态映射的规则又有些不够灵活。幸运的是,你可以调整某些设置来让动态映射的规则更加适合你的数据。

date_detection

当ES碰到一个新的字符串字段时,它会检查该字串是否含有一个可被识别的日期,比如2014-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字段,你需要手动地添加它。

NOTE

ES中识别日期的方法可以通过dynamic_date_formats设置改变。

dynamic_templates

通过dynamic_templates,你可以拥有对新字段的动态映射规则拥有完全的控制。你设置可以根据字段名称或者类型来使用一个不同的映射规则。

每个模板都有一个名字,可以用来描述这个模板做了什么。同时它有一个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模式能够用来排除某些字段,没有被排除的字段则会被匹配。

参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/1.4//mapping-root-object-type.html

时间: 2024-12-09 16:08:24

Elasticsearch - 自动检测及动态映射Dynamic Mapping的相关文章

[Elasticsearch] 索引管理 (四) - 动态映射

动态映射(Dynamic Mapping) 当ES在文档中碰到一个以前没见过的字段时,它会利用动态映射来决定该字段的类型,并自动地对该字段添加映射. 有时这正是需要的行为,但有时不是.你或许不知道在以后你的文档中会添加哪些字段,但是你想要它们能够被自动地索引.或许你只是想要忽略它们.或者 - 尤其当你将ES当做主要的数据存储使用时 - 大概你会希望这些未知的字段会抛出异常来提醒你注意这一问题. 幸运的是,你可以通过dynamic设置来控制这一行为,它能够接受以下的选项: true:默认值.动态添

ES 12 - 配置使用Elasticsearch的动态映射(dynamic mapping)

目录 1 动态映射(dynamic mapping) 1.1 什么是动态映射 1.2 体验动态映射 1.3 搜索结果不一致的原因分析 2 开启dynamic mapping策略 2.1 约束策略 2.2 策略示例 3 定制dynamic mapping策略 3.1 date_detection - 日期识别策略 3.2 在type中自定义动态映射模板 3.3 [过期]在index中自定义默认映射模板 1 动态映射(dynamic mapping) 1.1 什么是动态映射 动态映射时Elastic

Elasticsearch 动态映射——自动检测

ES中有一个非常重要的特性——动态映射,即索引文档前不需要创建索引.类型等信息,在索引的同时会自动完成索引.类型.映射的创建. 那么什么是映射呢?映射就是描述字段的类型.如何进行分析.如何进行索引等内容. 本篇就着重讲述下,ES中映射的自动检测特性. 更多内容参考:Elastisearch知识总结 字段自动检测 在某个字段第一次出现时,如果之前没有定义过映射,ES会自动检测它可能满足的类型,然后创建对应的映射. JSON数据 ES中的数据类型 null 不会添加字段 true or false

Elasticsearch:Dynamic mapping

Elasticsearch最重要的功能之一是它试图摆脱你的方式,让你尽快开始探索你的数据. 要索引文档,您不必首先创建索引,定义映射类型和定义字段 - 您只需索引文档,那么index,type和field将自动生效.比如: PUT data/_doc/1 { "count": 5 } 上面的命令将自动帮我们生成一个叫做data的index,并同时生成一个叫做_doc的type及一个叫做count的field.count的数据类型是long.这个非常方便,我们不想传统的RDMS那样,先要

ElasticSearch之动态映射和模板

1 类型确定机制 mappings numeric_detection dynamic :是否支持动态添加字段 2 动态映射 希望根据不同情形,如JSON格式中的字段名称和字段类型,来确定不同类型. 3 索引模板

65.dynamic mapping

主要知识点: 理解dynamic mapping 定制dynamic mapping 更改default dynamic mapping 一.理解dynamic mapping 1.基本概念 One of the most important features of Elasticsearch is that it tries to get out of your way and let you start exploring your data as quickly as possible.

映射(mapping)

就像是在 Data in, data out中解释过的,index中的每个document都有type.每个type都有自己的mapping或者schema definition.在type中mapping定义filed,定义每个filed中的数据类型,定义ES怎么处理这个filed,mapping也用于配置与该类型相关联的元数据. 我们会在 Types and Mappings中详细的讨论mapping,在这个章节,我们就是能让你足够开始就行了. core simple field types

ElasticSearch权威指南学习(映射和分析)

概念 映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型(string, number, booleans, date等).+ 分析(analysis)机制用于进行全文文本(Full Text)的分词,以建立供搜索用的反向索引. 数据类型差异 在索引中有12个tweets,只有一个包含日期2014-09-15,但是我们看看下面查询中的total hits. GET /_search?q=2014 # 12 个结果 GET /_search?q=2014-09-15

[Elasticsearch] 索引管理 (五) - 默认映射,重索引,索引别名

默认映射(Default Mapping) 一般情况下,索引中的所有类型都会有相似的字段和设置.因此将这些常用设置在_default映射中指定会更加方便,这样就不需要在每次创建新类型的时候都重复设置._default映射的角色是新类型的模板.所有在_default映射之后创建的类型都会包含所有的默认设置,除非显式地在类型映射中进行覆盖. 比如,我们使用_default映射对所有类型禁用_all字段,唯独对blog类型启用它.可以这样实现: PUT /my_index { "mappings&qu