Elasticsearch核心技术与实战学习笔记 第三章 18 | Dynamic Mapping和常见字段类型

一 序

  本文属于极客时间Elasticsearch核心技术与实战学习笔记系列。

上一节主要讲解什么是 URL Search 和 Request Body Search 的语法。本节对 Mapping 的 Dynamic Mapping 介绍。

二 Mapping

Mapping 类似数据库的 schema 的定义,作用如下

  • 定义索引中的字段名称
  • 定义字段的数据类型,例如字符串,数字,布尔…
  • 字段,倒排索引的相关配置,(Analyzed or Not Analyzed,Analyzer)

Mapping 会把 JSON 文档映射称 Lucene 所需的扁平格式
一个 Mapping 属于一个索引的 Type

  • 每个文档都属于一个 Type
  • 一个 Type 有一个 Mapping 定义
  • 7.0 开始,不需要在 Mapping 定义指定 type 信息

字段的数据类型

简单类型

  • Text / Keyword
  • Date
  • Integer / Floating
  • Boolean
  • IPv4 & IPv6

复杂类型 - 对象和嵌套对象

  • 对象类型 / 嵌套类型

特殊类型

  • geo_point & geo_shape / percolator

Dynamic Mapping

在写入文档的时候,如果索引不存在,会自动创建索引。
Dynamic Mapping 的机制,使得我们无需手动定义 Mappings。Elasticsearch 会自动根据文档信息,推算出字段的类型。
但是会有时候推算不对。例如地理位置信息。
当类型如果设置不对时,会导致一些功能无法正常运行,例如 Range 查询。

类型的自动识别

扫描二维码关注公众号,回复: 11373875 查看本文章
#写入文档,查看 Mapping
PUT mapping_test/_doc/1
{
  "firstName":"Chan",
  "lastName": "Jackie",
  "loginDate":"2018-07-24T10:29:48.103Z"
}

#查看 Mapping文件
GET mapping_test/_mapping

结果:

{
  "mapping_test" : {
    "mappings" : {
      "properties" : {
        "firstName" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "lastName" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "loginDate" : {
          "type" : "date"
        }
      }
    }
  }
}
#Delete index
DELETE mapping_test

#dynamic mapping,推断字段的类型
PUT mapping_test/_doc/1
{
    "uid" : "123",
    "isVip" : false,
    "isAdmin": "true",
    "age":19,
    "heigh":180
}
#查看 Dynamic
GET mapping_test/_mapping

查看结果: 

{
  "mapping_test" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "long"
        },
        "heigh" : {
          "type" : "long"
        },
        "isAdmin" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "isVip" : {
          "type" : "boolean"
        },
        "uid" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

能否更改 Mapping 的字段类型

两种情况
新增字段

  • Dynamic 设置为 true 时,一定有新增字段的文档写入,Mapping 也同时被更新
  • Dynamic 设为 false,Mapping 不会被更新,自增字段的数据无法被索引,但是信息会出现在_source 中
  • Dynamic 设置成 Strict 文档写入失败

对已有字段,一旦已经有数据写入,就不在支持修改字段定义

  • Luene 实现的倒排索引,一旦生成后,就不允许修改
  • 如果希望改变字段类型,必须 Reindex API,重建索引

原因
如果修改了字段的数据类型,会导致已被索引的属于无法被搜索
但是如果是增加新的字段,就不会有这样的影响。

demo

#默认Mapping支持dynamic,写入的文档中加入新的字段
PUT dynamic_mapping_test/_doc/1
{
  "newField":"someValue"
}

#该字段可以被搜索,数据也在_source中出现
POST dynamic_mapping_test/_search
{
  "query":{
    "match":{
      "newField":"someValue"
    }
  }
}

//能被搜索到

"hits" : [
      {
        "_index" : "dynamic_mapping_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "newField" : "someValue"
        }
      }

#修改为dynamic false
PUT dynamic_mapping_test/_mapping
{
  "dynamic": false
}

#新增 anotherField
PUT dynamic_mapping_test/_doc/10
{
  "anotherField":"someValue"
}


#该字段不可以被搜索,因为dynamic已经被设置为false
POST dynamic_mapping_test/_search
{
  "query":{
    "match":{
      "anotherField":"someValue"
    }
  }
}

   "hits" : [ ]

#修改为strict
PUT dynamic_mapping_test/_mapping
{
  "dynamic": "strict"
}
#写入数据出错,HTTP Code 400
PUT dynamic_mapping_test/_doc/12
{
  "lastField":"value"
}

{
  "error": {
    "root_cause": [
      {
        "type": "strict_dynamic_mapping_exception",
        "reason": "mapping set to strict, dynamic introduction of [lastField] within [_doc] is not allowed"
      }
    ],
    "type": "strict_dynamic_mapping_exception",
    "reason": "mapping set to strict, dynamic introduction of [lastField] within [_doc] is not allowed"
  },
  "status": 400
}

猜你喜欢

转载自blog.csdn.net/bohu83/article/details/106167144
今日推荐