Elasticsearch索引映射详解mapping.properties

概述

映射是定义如何索引和存储文档和字段的过程,例如:

  • 定义字段类型,哪些字段作为全文索引,哪些字段是数值、日期类型
  • 定义日期字段的格式
  • 控制动态添加字段的映射的自定义规则

字段类型

  • 字符串类型:
    (1)text:通常用来存储长文本字段,例如博客标题、内容。通过定义analyzer,实现分词索引。
    (2)keyword:不分词的字符串类型,存什么就是什么。
  • 数值类型:long、integer、short、byte、double、float
  • 日期类型:date
  • 布尔类型:boolean
  • 复合类型:
    (1)object:包含一个子对象
    (2)nested:包含一个或多个子对象
  • 地理类型:geo_point
  • 其他特定类型:ip、completion、join、alias等等

防止映射爆炸

对一个索引定义过多的字段时,可能会导致映射爆炸。也就是说,它将耗费大量的内存空间,甚至是内存溢出报错。为了防止这种情况出现,可以设置以下的属性值:

属性 说明
index.mapping.total_fields.limit 设置一个索引最多允许有多少字段,默认值是1000
index.mapping.depth.limit 设置字段的最大深度,主要用于限制复合字段类型。默认值是50
index.mapping.nested_objects.limit 设置一个文档最多能有多少nested子对象,防止一个文档对象占用过大的内存空间。默认值是10000
index.mapping.field_name_length.limit 设置字段名称的最大长度,默认不限制

动态映射

当你往索引添加的文档数据中,存在mapping不存在的字段时,es会自动将该字段添加到mapping映射中。甚至整个索引都不存在时,也会自动创建索引。这就是动态映射。

举个例子,当前es不存在名称为article的索引,执行如下语法:

POST /article/_doc/1
{
    
    
  "title":"2020年1月1日天气报告",
  "author": "张三",
  "comments":[
    {
    
    
      "comment": "不错",
      "user": "小张"
    },
    {
    
    
      "comment": "有点不准",
      "user": "小红"
    }
  ]
}

这时看下索引目录,会发现自动创建了article索引,并且数据也保存了
在这里插入图片描述

注意:comments在这里被映射成object类型,如果要使用nested则需要提前做精确映射,而不能使用动态映射。

精确映射

当我们需要自己控制字段类型,而不需要es凭借猜测自动映射,此时就可以使用精确映射。也就是提前创建好mapping,然后再添加数据,这也是目前大多数项目中使用的方式。

这里有一段代码,执行后会创建名称为article的索引:

PUT article
{
    
    
  "mappings": {
    
    
    "properties": {
    
    
      "title":{
    
    
        "type": "text",
        "fields": {
    
    
          "keyword":{
    
    
            "type": "keyword"
          }
        }
      },
      "author":{
    
    
        "type": "keyword"
      },
      "comments":{
    
    
        "type": "nested"
      }
    }
  }
}

看下跟动态映射的不同之处,这里可以控制为nested。nested和object的区别这里不多介绍了,后面再另外讲解。
在这里插入图片描述

给索引添加字段

数据库可以添加字段,elasticsearch这边也同样可以。
语法如下,对article索引添加一个名称为publishOn的字段,类型是date:

PUT /article/_mapping
{
    
    
  "properties":{
    
    
    "publishOn":{
    
    
      "type": "date",
      "format": "yyyy-MM-dd HH:mm:ss"
    }
  }
}

更新字段类型

elasticsearch不支持更改现有字段的映射或字段类型。

官方建议:
创建一个新索引,并将数据重新索引到该索引中。

查看索引的映射mapping

GET /article/_mapping

得到结果:

{
    
    
  "article" : {
    
    
    "mappings" : {
    
    
      "properties" : {
    
    
        "author" : {
    
    
          "type" : "keyword"
        },
        "comments" : {
    
    
          "type" : "nested",
          "properties" : {
    
    
            "comment" : {
    
    
              "type" : "text",
              "fields" : {
    
    
                "keyword" : {
    
    
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "user" : {
    
    
              "type" : "text",
              "fields" : {
    
    
                "keyword" : {
    
    
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        },
        "publishOn" : {
    
    
          "type" : "date",
          "format" : "yyyy-MM-dd HH:mm:ss"
        },
        "title" : {
    
    
          "type" : "text",
          "fields" : {
    
    
            "keyword" : {
    
    
              "type" : "keyword"
            }
          }
        }
      }
    }
  }
}

查看指定字段的映射

GET /article/_mapping/field/title

得到结果:

{
    
    
  "article" : {
    
    
    "mappings" : {
    
    
      "title" : {
    
    
        "full_name" : "title",
        "mapping" : {
    
    
          "title" : {
    
    
            "type" : "text",
            "fields" : {
    
    
              "keyword" : {
    
    
                "type" : "keyword"
              }
            }
          }
        }
      }
    }
  }
}

猜你喜欢

转载自blog.csdn.net/qq_28834355/article/details/109032708