前言
我们知道,我们是在ElasticSearch(简称ES)上创建索引文档后,哪怕我们之前没有指定字段的类型,但ES还是会给我们的文档数据给予相对应的字段属性,这背后是什么原理呢?同时,ES中又提供了哪些常见的数据类型给我们使用呢?是否可以自定义Mapping模板来方便自己使用呢?本篇文章将围绕ES的Mapping配置来对上面的问题进行一一解答,希望可以对这方面不熟悉的读者一个参考。
注意:文章中的演示版本为Elastic Search7.6.1,具体的语法各位读者以自己本地的es版本为准
一、Mapping简介
Mapping类似于数据库中的表结构定义,我们可以通过它来定义Index下的字段名(Field Name )、定义字段的类型,比如数值型、字符串型、布尔型等、定义倒排索引相关的配置,比如是否索引、记录position等
PUT /mapping_index
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}
Mapping入门
二、自定义Mapping的API介绍
(一)Dynamic 新增字段严格性
Mappings的API介绍如下:
Mappings的API介绍
Mapping 中的字段类型一旦设定后,禁止直接修改,因为Lucene实现的倒排索引生成后不允许修改。原因也很好理解,如果可以随意更改字段类型的话,会影响倒排索引的使用,试想一下,如果一个字段原先是text类型,如果变更成keyword类型的话,原先已有的倒排索引就要重新reindex后才能继续使用。
但是ES允许我们对已有的索引进行新增字段的操作,具体的实现方式是通过dynamic参数来定义的。
dynamic-value
含义
true(默认)
允许自动新增字段
false
不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
strict
文档不能写入,报错
新增不存在的文档字段
通过hobby字段进行查询
dynamic定义为严格模式
(二)copy_to 字段复制
copy_to 可以将该字段的值复制到目标字段,实现类似于_all的作用
PUT /mapping_index
{
"mappings": {
"properties": {
"lastname": {
"type": "text",
"copy_to": "fullname"
},
"firstname": {
"type&#