【ElasticSearch-基础篇】Mapping结构

本文介绍了Elasticsearch中Mapping的概念,它类似MySQL的schema,用于定义索引属性字段。还阐述了自动创建Mapping的情况,以及动态映射(dynamic mapping)。动态映射分动态、非动态和严格三种模式,每种模式在索引文档、字段及变更Mapping时有不同表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

1.什么是Mapping

Mapping 类似 mysql 中的 schema 的定义
用于定义索引属性字段的名称、字段的数据类型 (如 text , long , keyword…)、字段的倒排索引相关配置
一个Mapping 属于一个索引的Type、每个文档都属于一个Type
es7.0开始, 在Mapping中不需要指定 Type信息, 因为7.0之后只有_doc Type

2.自动创建Mapping

当我们去创建一个 索引的时候 未指定 mapping , es会默认帮这个索引创建一个 mapping
例:创建一个索引testmapping

创建一个空索引:

PUT testmapping

创建成功:

{
   
   
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "testmapping"
}

查询该索引mapping信息:

GET testmapping/_mapping

返回结果:

{
   
   
  "testmapping" : {
   
   
    "mappings" : {
   
    }
  }
}

此时可以看到ES为我们创建了一个空mapping的索引,如果我们在创建索引的时候指定字段,ES也会生成我们指定的字段类型,或者默认的类型

创建名为user的索引,并指定字段及字段类型

PUT /user
{
   
   
  "mappings": {
   
   
    "properties": {
   
   
      "title": {
   
   
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "language": {
   
   
        "type": "keyword"
      },
      "price": {
   
   
        "type": "double"
      },
      "publish_time": {
   
   
        "type": "date",
        "format": "yyy-MM-dd"
      }
    }
  }
}

获取user的mapping信息

GET user/_mapping

{
   
   
  "user" : {
   
   
    "mappings" : {
   
   
      "properties" : {
   
   
        "language" : {
   
   
          "type" : "keyword"
        },
        "price" : {
   
   
          "type" : "double"
        },
        "publish_time" : {
   
   
          "type" : "date",
          "format" : "yyy-MM-dd"
        },
        "title" : {
   
   
          "type" : "text",
          "analyzer" : "ik_max_word"
        }
      }
    }
  }
}

动态映射(dynamic mapping)

关系型数据库: 先创建表 => 指定字段和字段类型 => 数据写入表
在ES中,索引就相当于表,文档就相当于记录,文档里面的字段就相当于表的字段,字段同样有数据类型。mapping就用来定义文档有哪些字段,这些字段如何存储和索引。

ES与关系型数据库不同之处在于: 其不需要先定义表结构,而可以根据写入文档的内容,来推断字段和数据类型,创建索引结构,这就是dynamic mapping,动态映射的由来。这提供了极大的灵活性。
注:一个索引的字段数量有上限的,超过上限就会报错(默认单个索引创建最大1000个字段)

dynamic参数设置:
按dynamic值,可分为下面三种模式

动态模式(dynamic:true),根据输入文档的内容,自动推断字段和类型,创建mapping
非动态模式(dynamic:false),无法根据输入文档的内容,自动创建mapping,需要手动创建mapping
严格模式(dynamic:strict),同非动态模式,区别在于,非动态模式,输入的文档中如果有字段不在mapping中,依然可以存储和读取,但是该字段不在mapping中,因此也无法根据该字段进行检索;但严格模式,无法存储,会直接报错,严格模式实际上就类似于关系型数据库中的表了。

1.动态模式

直接对一个不存在的索引插入一条数据

POST dynamictrue/_doc
{
   
   
  "name": "张三",
  "age": 15
}

插入成功,获取该索引的mapping信息

GET dynamictrue/_mapping

{
   
   
  "dynamictrue" : {
   
   
    "mappings" : {
   
   
      "properties" : {
   
   
        "age" : {
   
   
          "type" : "long"
        },
        "name" : {
   
   
          "type" : "text",
          "fields" : {
   
   
            "keyword" : {
   
   
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

在动态模式下,ES会根据插入的数据自动生成对应的字段类型,也可以通过动态模板(dynamic template)来覆盖这个规则,实现自定义推测规则,具体可以参考ES官网

1.1动态模式下索引文档

GET dynamictrue/_search

{
   
   
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
   
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡皮卡皮·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值