自学内容网 自学内容网

重生之我们在ES顶端相遇第6 章- Dynamic Mapping(动态映射)

思维导图

在这里插入图片描述

前言

在第5章,我们说完 ES 常用字段类型。但是,并未跟大家解释,为什么不设置 Mapping,写入的字符串,默认就可以全文搜索。例如

PUT /test4/_doc/1
{
    "name": "hello world"
}
GET /test4/_search
{
    "query": {
        "match_bool_prefix": {
            "name": {
                "query": "search wor",
                "operator": "or"
            }
        }
    }
}

这一切都跟 ES 的 dynamic mapping 功能有关。下面我将介绍这一功能。

Dynamic Mapping

可选值介绍

dynamic mapping 默认是开启的。 ES 有以下 4 个可选值

  • • true: 往文档写入新字段时,会自动创建字段类型(默认值)
  • • runtime: 往文档写入新字段时,会自动创建字段类型, 与 true 的区别为,2者字段映射不一样
  • • false: 忽略该字段,无法检索该字段,但是文档中可以看到该字段
  • • strict: 有新字段,则拒绝本次写入
设置 dynamic mapping

创建索引时,手动设置 dynamic 属性值

PUT test4
{
  "mappings": {
    "dynamic": "false",
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "ctime": {
        "type": "date"
      }
    }
  }
}

修改已存在的索引的 dynamic

PUT test4/_mapping
{
  "dynamic": true
}
字段映射默认值
JSON date type“dynamic”:“true”“dynamic”:“runtime”
null不添加字段不添加字段
truefalsebooleanboolean
doublefloatdouble
longlonglong
objectobject不添加字段
array以数组中第一个不为空的元素为准以数组中第一个不为空的元素为准
日期字符串(更多见下文 date detection)datedate
数字字符串(更多见下文 number detection)floatlongdoublelong
不匹配日期、数字的字符串text 以及 .keyword 的子字段keyword
回答开篇提出的问题

学习到这里,就可以解释开篇提出的问题了:为什么不设置 Mapping,写入的字符串,默认就可以全文搜索?

因为索引的 dynamic 默认为 true,当输入的非日期、数字字符串时,会被自动映射为 text 以及携带 .keyword 子字段。

DELETE test4
PUT test4/_doc/1
{
  "name": "hello world"
}
GET test4/_mapping

在这里插入图片描述

Date detection

dete_tection 功能默认启用,即如果添加了一个新的字符串字段,且满足该数据格式 [ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"] 则会添加一个 date 字段。

禁用 date detection

创建索引时,设置 date_tection

DELETE test4
PUT test4
{
  "mappings": {
    "dynamic": "false",
    "date_detection": false, 
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "ctime": {
        "type": "date"
      }
    }
  }
}

修改已存在的索引的 date_tection

PUT test4/_mapping
{
  "dynamic": true,
  "date_detection": true
}
自定义 date detection

创建索引时,设置 dynamic_date_formats

DELETE test4
PUT test4
{
  "mappings": {
    "dynamic": "false",
    "date_detection": false, 
    "dynamic_date_formats": ["MM/dd/yyyy"],
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "ctime": {
        "type": "date"
      }
    }
  }
}

修改已存在的索引的 dynamic_date_formats

PUT test4/_mapping
{
  "dynamic": true,
  "date_detection": true,
  "dynamic_date_formats": ["MM/dd/yyyy"]
}
Number detection

numeric_detection 默认是被禁用的。

DELETE test4
PUT test4
{
  "mappings": {
    "numeric_detection": true
  }
}

结语

本章介绍了 ES dynamic mapping。下一章,将介绍 ES 的 dynamic template,其可以更好的控制 ES 的字段映射。dynamic template 功能在开发中也相对比较常用。


原文地址:https://blog.csdn.net/qq_32880923/article/details/140568336

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!