映射的基本概念
Mapping 也称之为映射,定义了 ES 的索引结构、字段类型、分词器等属性,是索引必不可少的组成部分。
ES 中的 mapping 有点类似与RDB中“表结构”的概念,在 MySQL 中,表结构里包含了字段名称,字段的类型还有索引信息等。在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有多个类型。分词器、评分等概念在后面的文章介绍。
想象一下,你要建立一个巨大的、电子化的图书馆,这个图书馆就是 Elasticsearch(ES)。
核心比喻:ES 是一个图书馆
- ES 集群 = 整个图书馆大楼
- 索引 = 图书馆里的一个特定书库(比如“小说书库”、“历史书库”、“科技书库”)。
- 文档 = 书库里的一本本具体的书。
- Mapping(映射) = 就是每个书库的**《图书分类与编目规则手册》**。
这本《规则手册》(Mapping)里规定了什么?
现在,我们来详细看看这本《规则手册》到底写了啥,为什么它必不可少。
1. 字段名称和类型(类似 MySQL 的表结构)
手册里规定了一本书应该记录哪些信息,以及这些信息的格式。
- 书名:类型是
文本
。因为你要根据文字内容来搜索。 - 出版日期:类型是
日期
。这样电脑才能按时间顺序排列或筛选。 - 页数:类型是
数字
。这样你才能搜索“页数大于300页的书”。 - 是否精装:类型是
是/否
(布尔值)。用于快速筛选。
=> 在 ES 中:Mapping 定义了每个字段的名称和类型,比如 title
是 text
类型,publish_date
是 date
类型。这是最基础的功能,和 MySQL 表结构确实很像。
2. 一个字段可以有多个类型(ES 的强大之处)
这是 ES 很特别的一点。比如“书名”这个信息,手册里可能规定:
- 场景A:用于全文搜索(比如读者在电脑里输入关键词“冒险”找书)。 处理方式:需要把整本书记录的“书名”字段拆分成一个个词(比如《海底两万里》会被拆成“海底”、“两万”、“里”),并且忽略分数(不重要)。
- 场景B:用于精确排序(比如按书名字母顺序排列)。 处理方式:保留完整的书名“海底两万里”,用来做排序。
=> 在 ES 中:可以通过一个叫fields
的特性,让title
字段同时拥有两种类型:一个text
类型用于分词搜索,一个keyword
类型用于精确排序或聚合。这就是“一个字段可以有多个类型”的通俗解释,非常灵活!
3. 分词器(搜索引擎的核心)
这是手册里最关键的一条规则!它规定了如何把一段长文本(比如一篇文章的内容)拆分成一个个独立的、可搜索的词汇。
- 例子:句子“我爱吃苹果和香蕉”。
- 中文分词器:可能会把它拆成
我
,爱
,吃
,苹果
,和
,香蕉
。这样你搜“苹果”才能搜到。 - 英文分词器:处理“I love apple”会拆成
i
,love
,apple
,并统一变成小写。
如果手册没规定好用哪种分词器,或者用错了,就会出现搜“苹果”却搜不出来任何结果的情况,因为系统可能把整句话当成一个词来处理了。
=> 在 ES 中:Mapping 里会为每个文本类型的字段指定使用的分词器,这直接决定了你的搜索效果好不好。
4. 是否创建索引 / 是否评分
- 是否创建索引:就像手册规定“这本书的‘ISBN号’需要做索引卡(索引),方便快速查找;但‘封面设计灵感说明’这个字段不需要做索引卡(不索引),因为没人会通过这个来找书”。 好处:不索引的字段节省空间,写入更快。
- 是否评分:就像手册规定“搜索时,如果关键词在‘书名’里出现,比在‘内容简介’里出现,相关性(评分)更高”。 比如搜“宇宙”,一本名叫《宇宙之谜》的书应该比一本只是内容里提到宇宙的书排名更靠前。如果你关闭了某个字段的评分,那它就不会影响排名。
总结一下
如果把 ES 索引比作一个书库,Mapping 就是建立这个书库时制定的那本最核心的《管理与检索规则手册》。
- 它定义了书库里的书(文档)长什么样(有哪些字段,什么类型)。
- 它规定了如何对书的内容进行处理(用分词器拆解词汇)。
- 它决定了如何快速找到你想要的书(是否建索引、如何评分)。
没有 Mapping 会怎样?
ES 虽然可以自动猜字段类型(动态映射),但就像让一个不专业的图书管理员来编目,他很可能会搞错。比如把“ISBN号”这个本应精确匹配的字段,错误地当成了可以分词的文本,导致你无法精确搜索ISBN。所以,事先定义好精确的 Mapping,是保证你的“图书馆”高效运转的关键。