Skip to content
📖0 阅读·🤍0 点赞

映射的基本概念

Mapping 也称之为映射,定义了 ES 的索引结构、字段类型、分词器等属性,是索引必不可少的组成部分。

ES 中的 mapping 有点类似与RDB中“表结构”的概念,在 MySQL 中,表结构里包含了字段名称,字段的类型还有索引信息等。在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建索引等属性,并且在ES中一个字段可以有多个类型。分词器、评分等概念在后面的文章介绍。

想象一下,你要建立一个巨大的、电子化的图书馆,这个图书馆就是 Elasticsearch(ES)


核心比喻:ES 是一个图书馆

  • ES 集群 = 整个图书馆大楼
  • 索引 = 图书馆里的一个特定书库(比如“小说书库”、“历史书库”、“科技书库”)。
  • 文档 = 书库里的一本本具体的书
  • Mapping(映射) = 就是每个书库的**《图书分类与编目规则手册》**。

这本《规则手册》(Mapping)里规定了什么?

现在,我们来详细看看这本《规则手册》到底写了啥,为什么它必不可少。

1. 字段名称和类型(类似 MySQL 的表结构)

手册里规定了一本书应该记录哪些信息,以及这些信息的格式。

  • 书名:类型是文本。因为你要根据文字内容来搜索。
  • 出版日期:类型是日期。这样电脑才能按时间顺序排列或筛选。
  • 页数:类型是数字。这样你才能搜索“页数大于300页的书”。
  • 是否精装:类型是是/否(布尔值)。用于快速筛选。

=> 在 ES 中:Mapping 定义了每个字段的名称和类型,比如 titletext类型,publish_datedate类型。这是最基础的功能,和 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,是保证你的“图书馆”高效运转的关键。