欢迎光临
我们一直在努力

Elasticsearch核心:Mapping映射全解析+定义实战教程

Elasticsearch核心:Mapping映射全解析+定义实战教程

    • 一、前言
    • 二、基础概念:什么是Elasticsearch Mapping?
      • 2.1 核心定义
      • 2.2 Mapping核心作用
      • 2.3 Mapping工作流程图
    • 三、Elasticsearch Mapping的两种类型
      • 3.1 类型1:动态映射(Dynamic Mapping)
        • 3.1.1 原理
        • 3.1.2 自动类型推断规则
        • 3.1.3 优缺点
        • 3.1.4 动态映射演示(自动创建)
      • 3.2 类型2:静态映射(Static Mapping)
        • 3.2.1 原理
        • 3.2.2 优缺点
        • 3.2.3 静态映射演示(手动创建)
    • 四、Elasticsearch 常用核心字段类型
      • 4.1 核心字段类型清单
      • 4.2 关键字段类型对比
    • 五、如何定义Elasticsearch Mapping?(3种实战方式)
      • 5.1 方式1:创建索引时定义静态Mapping(生产首选)
      • 5.2 方式2:动态映射(自动创建,仅测试)
      • 5.3 方式3:新增字段(动态更新Mapping)
    • 六、Mapping核心注意事项(必看,避坑指南)
      • 6.1 核心规则(新手必背)
      • 6.2 生产最佳实践
    • 七、查看与管理Mapping常用命令
      • 7.1 查看索引Mapping
      • 7.2 删除索引(修改Mapping必须删除重建)
    • 八、总结

🌺The Begin🌺点点关注,收藏不迷路🌺

一、前言

在Elasticsearch(ES)的使用中,Mapping映射是最核心、最基础的知识点,也是新手最容易踩坑的环节。很多人遇到“查询不到数据、聚合失败、字段类型错误”等问题,本质都是Mapping配置不当。

本文将从基础定义、核心作用、动态映射、静态映射、字段类型、定义方式等维度,全方位解析ES Mapping,搭配流程图、实战代码,让你彻底掌握Mapping的使用技巧,避开生产环境90%的字段配置坑。

二、基础概念:什么是Elasticsearch Mapping?

2.1 核心定义

  • Mapping:可以理解为ES索引的结构化定义规则,相当于关系型数据库的表结构(Schema)。
  • 它的核心作用是:告诉ES如何索引和存储数据,定义索引中字段的名称、数据类型、分词规则、是否可索引等规则。
  • 简单总结:Mapping = 索引的数据结构说明书。
  • 2.2 Mapping核心作用

  • 定义索引中字段的数据类型(text、keyword、date等)
  • 定义字段是否需要分词、索引、存储
  • 控制字段的查询、聚合、排序能力
  • 提升数据写入和查询的性能与准确性
  • 2.3 Mapping工作流程图

    #mermaid-svg-o4UucAOn2AkCaXvz{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-o4UucAOn2AkCaXvz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-o4UucAOn2AkCaXvz .error-icon{fill:#552222;}#mermaid-svg-o4UucAOn2AkCaXvz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-o4UucAOn2AkCaXvz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz .marker.cross{stroke:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-o4UucAOn2AkCaXvz p{margin:0;}#mermaid-svg-o4UucAOn2AkCaXvz .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster-label text{fill:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster-label span{color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster-label span p{background-color:transparent;}#mermaid-svg-o4UucAOn2AkCaXvz .label text,#mermaid-svg-o4UucAOn2AkCaXvz span{fill:#333;color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .node rect,#mermaid-svg-o4UucAOn2AkCaXvz .node circle,#mermaid-svg-o4UucAOn2AkCaXvz .node ellipse,#mermaid-svg-o4UucAOn2AkCaXvz .node polygon,#mermaid-svg-o4UucAOn2AkCaXvz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .rough-node .label text,#mermaid-svg-o4UucAOn2AkCaXvz .node .label text,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape .label,#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape .label{text-anchor:middle;}#mermaid-svg-o4UucAOn2AkCaXvz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .rough-node .label,#mermaid-svg-o4UucAOn2AkCaXvz .node .label,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape .label,#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape .label{text-align:center;}#mermaid-svg-o4UucAOn2AkCaXvz .node.clickable{cursor:pointer;}#mermaid-svg-o4UucAOn2AkCaXvz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz .arrowheadPath{fill:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-o4UucAOn2AkCaXvz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-o4UucAOn2AkCaXvz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o4UucAOn2AkCaXvz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-o4UucAOn2AkCaXvz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o4UucAOn2AkCaXvz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-o4UucAOn2AkCaXvz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster text{fill:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster span{color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-o4UucAOn2AkCaXvz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-o4UucAOn2AkCaXvz rect.text{fill:none;stroke-width:0;}#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape p,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape .label rect,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o4UucAOn2AkCaXvz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-o4UucAOn2AkCaXvz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-o4UucAOn2AkCaXvz :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    写入JSON数据

    Mapping规则

    字段类型判定

    分词规则匹配

    构建倒排索引

    数据存储完成

    查询数据

    根据Mapping解析查询

    匹配倒排索引

    返回正确结果


    三、Elasticsearch Mapping的两种类型

    ES提供动态映射和静态映射两种方式,适用不同业务场景。

    3.1 类型1:动态映射(Dynamic Mapping)

    3.1.1 原理

    ES根据自动写入的数据,自动推断字段类型,无需手动定义。

    • 写入数据 → ES自动识别字段 → 自动创建Mapping
    • 开箱即用,适合快速开发、测试环境
    3.1.2 自动类型推断规则
  • JSON字符串 → 匹配text+keyword类型
  • JSON数字 → 匹配long/integer类型
  • JSON布尔值 → 匹配boolean类型
  • JSON日期字符串 → 匹配date类型
  • JSON对象 → 嵌套类型
  • 3.1.3 优缺点
    • 优点:无需手动配置,使用简单
    • 缺点:容易推断错误(如数字被识别为文本、日期识别失败),生产环境不推荐
    3.1.4 动态映射演示(自动创建)

    # 直接写入数据,ES自动创建Mapping
    POST /user_index/_doc/1
    {
    "name": "张三",
    "age": 20,
    "birthday": "2000-01-01"
    }

    # 查看自动生成的Mapping
    GET /user_index/_mapping


    3.2 类型2:静态映射(Static Mapping)

    3.2.1 原理

    手动提前定义索引的字段类型、分词规则等所有Mapping规则,写入数据必须遵循规则。

    • 提前定义Mapping → 创建索引 → 写入规范数据
    • 生产环境唯一推荐方式,保证数据准确性
    3.2.2 优缺点
    • 优点:字段类型可控、性能最优、避免自动推断错误
    • 缺点:需要提前规划字段,配置相对复杂
    3.2.3 静态映射演示(手动创建)

    # 创建索引+手动定义静态Mapping
    PUT /user_index
    {
    "mappings": {
    "properties": {
    "name": { "type": "text" }, // 文本类型,支持分词
    "age": { "type": "integer" }, // 整型
    "birthday": { "type": "date" }, // 日期类型
    "address": { "type": "keyword" } // 关键字,不分词
    }
    }
    }


    四、Elasticsearch 常用核心字段类型

    Mapping的核心是定义字段类型,ES提供丰富的类型,以下是生产最常用的6种:

    4.1 核心字段类型清单

  • text:文本类型,支持分词,用于全文检索(商品标题、文章内容)
  • keyword:关键字类型,不分词,用于精准匹配、聚合、排序(手机号、状态、地址)
  • integer/long:数字整型(年龄、ID、数量)
  • double/float:浮点型(价格、经纬度)
  • date:日期类型(创建时间、生日)
  • boolean:布尔类型(是否启用、是否删除)
  • object:对象类型(嵌套数据)
  • 4.2 关键字段类型对比

    类型分词适用场景支持聚合
    text 全文搜索、文章内容 不支持
    keyword 精准查询、排序、聚合 支持
    integer 数字统计 支持
    date 时间范围查询 支持

    五、如何定义Elasticsearch Mapping?(3种实战方式)

    5.1 方式1:创建索引时定义静态Mapping(生产首选)

    在创建索引的同时,手动定义所有字段规则,最标准、最常用。

    # 完整示例:创建商品索引+自定义Mapping
    PUT /product_index
    {
    "settings": {
    "number_of_shards": 3, // 主分片
    "number_of_replicas": 1 // 副本
    },
    "mappings": {
    "properties": {
    "product_id": { "type": "keyword" }, // 商品ID,不分词
    "product_name": { // 商品名称,分词
    "type": "text",
    "analyzer": "ik_max_word" // 使用IK分词器
    },
    "price": { "type": "double" }, // 价格
    "create_time": { "type": "date" }, // 时间
    "status": { "type": "keyword" } // 状态
    }
    }
    }

    5.2 方式2:动态映射(自动创建,仅测试)

    无需提前定义,直接写入数据,ES自动推断Mapping:

    # 直接写入数据,自动生成Mapping
    POST /test_index/_doc/1
    { "name": "测试", "count": 100 }

    5.3 方式3:新增字段(动态更新Mapping)

    已创建的索引,可以新增字段,但不能修改原有字段类型:

    # 给已有索引新增字段
    PUT /product_index/_mapping
    {
    "properties": {
    "brand": { "type": "keyword" } // 新增品牌字段
    }
    }


    六、Mapping核心注意事项(必看,避坑指南)

    6.1 核心规则(新手必背)

  • 已创建的字段,类型不能修改
    • 一旦定义为text,无法改为keyword,只能删除索引重建
  • 可以随时新增字段
    • 动态添加新字段,不影响原有数据
  • text类型默认不支持聚合和排序
    • 需要聚合必须使用fielddata或搭配keyword子字段
  • 日期格式必须规范
    • 否则自动映射失败,导致查询异常
  • 6.2 生产最佳实践

  • 禁止自动创建索引,提前手动定义静态Mapping
  • 文本字段统一使用:text + keyword 组合类型
  • 所有需要聚合、排序、精准查询的字段,必须用keyword
  • 提前规划字段,避免后期修改类型

  • 七、查看与管理Mapping常用命令

    7.1 查看索引Mapping

    # 查看单个索引Mapping
    GET /product_index/_mapping

    # 查看所有索引Mapping
    GET /*/_mapping

    7.2 删除索引(修改Mapping必须删除重建)

    DELETE /product_index


    八、总结

  • Mapping:ES索引的数据结构定义规则,相当于数据库表结构,决定数据如何存储和查询。
  • 两种类型:
    • 动态映射:自动推断,适合测试
    • 静态映射:手动定义,生产环境必用
  • 核心字段:
    • text:全文检索,支持分词
    • keyword:精准查询、聚合、排序
  • 黄金规则:字段类型创建后不可修改,提前规划,静态定义。
  • 在这里插入图片描述

    🌺The End🌺点点关注,收藏不迷路🌺

    赞(0)
    未经允许不得转载:171主机测评 » Elasticsearch核心:Mapping映射全解析+定义实战教程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址