理解 mapping—Elastic Stack 实战手册

简介: 映射(mapping)就像数据库中的 Schema ,描述了文档可能具有的字段或属性、每个字段的数据类型,比如 Text,Keyword,Integer 或 Date ,以及 Lucene 是如何索引和存储这些字段的。

970X90.png

· 更多精彩内容,请下载阅读全本《Elastic Stack实战手册》

· 加入创作人行列,一起交流碰撞,参与技术圈年度盛事吧

创作人:欧阳楚才

映射(mapping)就像数据库中的 Schema ,描述了文档可能具有的字段或属性、每个字段的数据类型,比如 text,keyword,integer 或 date ,以及 Lucene 是如何索引和存储这些字段的。

核心简单字段类型

Elasticsearch 支持如下简单字段类型:

  • 字符串: text,keyword
  • 整数:byte,short,integer,long
  • 浮点数: float,double
  • 布尔型: boolean
  • 日期: date
更多的字段类型比如 geo_point,ip,nested 等可以在链接处查看: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

当你索引一个包含新字段的文档之前,未曾出现 Elasticsearch 会使用动态映射,通过 JSON 中基本数据类型,尝试猜测字段类型,使用如下规则:

JSON 数据 字段类型
布尔型:true 或者 false boolean
整数:123 long
浮点数:123.45 double
字符串,有效日期:2021-05-01 date
字符串:foo bar text 和 keyword

注意:如果你通过引号 ( "123" ) 索引一个数字,它会被映射为字符串类型 text 和 keyword,而不是 long 。但如果这个字段已经映射为 long ,那么 Elasticsearch 会尝试将这个字符串转化为 long (在 coerce 设置为 true 的情况下),如果无法转化,则抛出一个异常。

查看映射

通过 /_mapping ,我们可以查看 Elasticsearch 在一个或多个索引中的映射。

Elasticsearch 文档写入示例:

PUT twitter/_doc/1
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}

PUT twitter/_doc/2
{
    "user": "kimchy",
    "post_date": "2009-11-15T14:12:12",
    "message": "Another tweet, will it be indexed?"
}

PUT twitter/_doc/3
{
    "user": "elastic",
    "post_date": "2010-01-15T01:46:38",
    "message": "Building the site, should be kewl"
}

查看索引映射示例:

GET twitter/_mapping

Elasticsearch 根据我们索引的文档,为字段动态生成的映射:

{
  "twitter" : {
    "mappings" : {
      "properties" : {
        "message" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "post_date" : {
          "type" : "date"
        },
        "user" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

注意:错误的映射,例如将年龄字段映射为 text 类型,而不是 integer ,会导致查询出现令人困惑的结果。

检查一下,而不是假设你的映射是正确的。

自定义字段映射

尽管在很多情况下基本字段数据类型已经够用,但你经常需要为单独字段自定义映射,特别是字符串字段。自定义映射允许你执行下面的操作:

  • 全文字符串字段和精确值字符串字段的区别
  • 使用特定语言分析器
  • 优化字段以适应部分匹配
  • 指定自定义数据格式
  • 还有更多

字段最重要的属性是 type 。

{
    "number_of_clicks": {
        "type": "integer"
    }
}

字符串字段类型,包括全文字符串 text 和精确值字符串 keyword。

text 类型字段的最重要属性是分析器 analyzer,默认 Elasticsearch 使用 Standard 分析器, 但你可以指定一个内置的分析器替代它,例如 whitespace 、 simple 、english、cjk:

{
   "message": {
    "type": "text",
    "analyzer": "cjk"
  }
}

创建/更新映射

当你首次创建一个索引的时候,可以指定类型的映射。你也可以使用 /_mapping 更新映射。

我们可以更新一个映射来添加一个新字段,但不能更新一个现有的 mapping 把它的字段类型从一个变为另外一个,比如从 text 变为 keyword。我

们可以在维持现有 mapping 的情况下,把一个字段变成一个 multi-field 字段。

为了描述指定映射的两种方式,我们先删除 twitter 索引:

DELETE twitter

创建一个新索引,指定 message 字段使用 cjk 分析器:

PUT twitter
{
  "settings": {
    "number_of_shards": "5",
    "number_of_replicas": "1"
  },
  "mappings": {
    "properties": {
      "user": {
        "type": "keyword"
      },
      "post_date": {
        "type": "date"
      },
      "message": {
        "type": "text",
        "analyzer": "cjk"
      }
    }
  }
}

通过消息体中指定的 mappings 创建了索引映射,索引设置 settings 中通过 number_of_shards 指定分片数,number_of_replicas 指定副本数。

给映射增加一个新的名为 tag 的 keyword 类型字段,使用 _mapping :

PUT twitter/_mapping
{
  "properties": {
    "tag": {
      "type": "keyword"
    }
  }
}

我们不需要再次列出所有已存在的字段,因为无论如何我们都无法改变它们,新字段已经被合并到存在的映射中。

测试映射

可以使用 analyze API 测试字符串字段的映射,比较下面两个请求的输出:

GET /twitter/_analyze
{
  "field": "message",
  "text": "搜索引擎" 
}

GET /twitter/_analyze
{
  "field": "tag",
  "text": "搜索引擎" 
}

消息体里面传入我们想要分析的文本。message 字段产生 3 个词条 ”搜索“、”索引” 和 ”引擎“, tag 字段产生单独的词条”搜索引擎“,换句话说,我们的映射正常工作。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
存储 API C++
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
【Qt 信号槽】深入探索 Qt 信号和槽机制中的引用传递“ (“A Deep Dive into Reference Passing in Qt Signal and Slot Mechanism“)
1551 0
|
5月前
|
存储 分布式计算 运维
迅雷基于阿里云 EMR Serverless Spark 实现数仓资源效率与业务提升
迅雷基于阿里云 EMR Serverless Spark 实现数仓资源效率与业务提升,在迁移到 EMR Serverless Spark 之后,TCO 明显下降,平台按作业生命周期弹性拉起与回收,只为实际消耗付费;同时,托管化带来了稳定性与调度效率提升;更关键的是交付确定性提升,大作业整体可提速约 1 小时,报表链路从长尾波动变成更可控的出数节奏。
Online Judge System 中术语含义: OJ、AC、WA、TLE、OLE、MLE、PE、RE、CE
Online Judge System 中术语含义: OJ、AC、WA、TLE、OLE、MLE、PE、RE、CE
4942 0
Online Judge System 中术语含义: OJ、AC、WA、TLE、OLE、MLE、PE、RE、CE
|
12月前
|
存储 人工智能 安全
阿里云中企出海技术分论坛精华概览 | 2025云栖大会回顾
2025云栖大会中企出海技术分论坛聚焦中国企业全球化挑战,阿里云联合易点天下、技威时代等企业,分享从“走出去”到“扎下根”的技术路径。论坛展示阿里云在基础设施、网络、安全、AI与数据库等领域的创新成果,推出全球一张网、AI网关、瑶池数据库等解决方案,助力企业构建安全、智能、敏捷的全球云底座,推动中国技术出海迈向新阶段。
阿里云中企出海技术分论坛精华概览 | 2025云栖大会回顾
|
6月前
|
人工智能 弹性计算 JavaScript
【最新】OpenClaw多Agent实战指南:分工设计+阿里云/本地部署+百炼API配置+避坑指南
“模型越强大,系统越混乱”——这是2026年很多OpenClaw用户的共同痛点。随着AI模型能力的提升,越来越多的用户试图让单个Agent包揽写作、分析、配置、排障等所有任务,结果却陷入上下文混杂、职责失焦、输出风格漂移的困境:写作文案里掺着工程术语,技术排障报告夹杂文案表达,复杂任务的上下文越积越重,效率不升反降。
1174 1
|
3月前
|
存储 边缘计算 人工智能
边缘计算+算法定制:如何让视觉AI在场景中真正落地?
视觉AI落地难?算法与场景错位、部署受限、数据合规压力大,导致“看得见却看不懂”。边缘计算盒子+定制化算法,实现本地实时分析、低延时告警、断网可用、数据不出场,让AI真正在工地、加油站、园区等复杂场景用起来。(239字)
499 1
|
3月前
|
机器学习/深度学习 自然语言处理 前端开发
售后回访全是机器噪音和方言,语音识别怎么做到98%准确率
售后电话回访场景中,机器运转噪音、方言口音、电话信道压缩是ASR识别的三大"杀手"。本文从信号处理、声学模型、语言模型三个层面,拆解高噪声环境下的语音识别技术方案,并结合实际案例说明如何将识别准确率提升至98%以上。
323 0
|
5月前
|
机器学习/深度学习 人工智能 安全
工业粉尘检测数据集分享(适用于YOLO系列深度学习分类检测任务)
本数据集含4000张工业场景粉尘图像(训练集2910张、验证集923张),人工精标YOLO/COCO格式,覆盖矿山、工厂、工地等多场景,适配YOLO系列目标检测与分类任务,助力智能粉尘监测研发。(239字)
338 2
|
4月前
|
存储 边缘计算 缓存
AIWCLOUD:CDN在Serverless架构下的冷启动缓解与边缘函数编排技术
本文探讨面向Serverless的新型CDN架构,通过边缘预测式预热、函数快照分发与分布式状态协调,将冷启动延迟从数百毫秒压缩至微秒级,推动CDN从静态缓存迈向动态计算编排。(239字)
254 0

热门文章

最新文章