Elasticsearch:为什么从 Elasticsearch 7.0.0 及更高版本中删除了映射类型 type?

在 Elasticsearch 7.0.0 或更高版本中创建的索引不再接受 default 映射。 在 6.x 中创建的索引将继续在 Elasticsearch 6.x 中像以前一样运行。 7.0 中的 API 中已弃用类型 type,并对索引创建、放置映射、获取映射、放置模板、获取模板和获取字段映射 API 进行了重大更改。

什么是映射类型?

我们知道 Elasticsearch 是一个文档数据库,映射类型 type 表示被索引的文档或实体的类型,例如 youtube 索引可能具有用户类型和视频类型。你可以粗俗地理解 type 为关系数据库中的表格 table。

每个映射类型都可以有自己的字段,因此用户 user 类型可能有一个 full_name 字段、一个 user_name 字段和一个电子邮件字段,而视频 video 类型可以有一个 video_url 字段、一个 uploaded_at 字段,以及像用户 user 类型一样的 user_name 字段。

每个文档都有一个包含类型名称的 _type 元数据字段,并且可以通过在 URL 中指定类型名称将搜索限制为一种或多种类型:

bash 复制代码
1.  GET youtube/user,video/_search
2.  {
3.    "query": {
4.      "match": {
5.        "user_name": "kimchy"
6.      }
7.    }
8.  }

文档的 _type 和 _id 字段组合生成 _uid 字段,有助于唯一标识存储在同一索引中具有相同 _id 的记录和文档。

下面的代码片段显示了不同类型的文档如何先前存储在同一索引中(请注意下面代码仅适用于于 7.0.0 之前的版本):

css 复制代码
1.  PUT youtube
2.  {
3.    "mappings": {
4.      "user": {
5.        "properties": {
6.          "name": { "type": "text" },
7.          "user_name": { "type": "keyword" },
8.          "email": { "type": "keyword" }
9.        }
10.      },
11.      "video": {
12.        "properties": {
13.          "video_url": { "type": "text" },
14.          "user_name": { "type": "keyword" },
15.          "uploaded_at": { "type": "date" }
16.        }
17.      }
18.    }
19.  }

上面的代码为 youtube 索引创建了一个映射,它有两种类型:user 和 video。

bash 复制代码
1.  PUT youtube/user/debraj
2.  {
3.    "name": "Debraj Bhal",
4.    "user_name": "debraj",
5.    "email": "[email protected]"
6.  }

8.  PUT youtube/video/1
9.  {
10.    "user_name": "debraj",
11.    "uploaded_at": "2017-10-24T09:00:00Z",
12.    "video_url": "https://myvideo.com"
13.  }

上面的代码片段用于分别创建/更新 _id debraj 类型的 user 和 _id 1 类型的 video 的文档。

可以通过使用请求 URL 中的类型名称来检索特定类型的这些文档,如下面的代码片段所示:

bash 复制代码
1.  GET youtube/video/_search
2.  {
3.    "query": {
4.      "match": {
5.        "user_name": "debraj"
6.      }
7.    }
8.  }

尽管映射类型 type 提供了如此出色的功能,但为什么它们被删除了?

在 Elasticsearch 中,索引类似于 SQL 数据库,类型类似于表。 但这个类比并不完全正确。 因为在 SQL 数据库中表是相互独立的,即不同表中同名的字段是完全独立的,互不依赖。

但在 Elasticsearch 索引中,不同映射类型中具有相同名称的字段在内部由相同的 Lucene 字段支持。 换句话说,使用上面的示例,用户类型中的 user_name 字段与视频类型中的 user_name 字段存储在完全相同的字段中,并且两个 user_name 字段在两种类型中必须具有相同的映射(定义,也即相同的数据类型)。

例如,当你想要定义 deleted 字段在同一索引中一种类型定义为 date 字段而在另一种类型中定义为 bool 字段时,这可能会导致失败。

此外,如果类型很少或没有共同字段,如果存储在同一索引中,会导致数据稀疏并干扰 Lucene 有效压缩文档的能力。 例如,在上面的示例中,只有 username 字段是常见的,因此对于视频类型,电子邮件和姓名类型字段没有用处,因此导致数据稀疏。

映射类型的替代方案

尽管映射类型存在一些缺点,但它们有助于组织链接数据。 因此,即使在 Elasticsearch 中删除映射类型之后,我们仍然可以通过两种方式实现类似的功能:

每个文档类型的索引:

第一种选择是为每个文档类型建立一个索引。 你可以将视频存储在视频 video 索引中,将用户存储在 user 索引中,而不是将视频和用户存储在单个 youtube 索引中。

自定义类型字段:

当然,集群中可以存在的主分片数量是有限的,因此你可能不希望为了仅包含几千个文档的集合而浪费整个分片。 在这种情况下,你可以实现自己的自定义类型字段,其工作方式与旧的 _type 类似。

json 复制代码
1.  PUT youtube
2.  {
3.    "mappings": {
4.      "_doc": {
5.        "properties": {
6.          "type": { "type": "keyword" }, 
7.          "name": { "type": "text" },
8.          "user_name": { "type": "keyword" },
9.          "email": { "type": "keyword" },
10.          "video_url": { "type": "text" },
11.          "uploaded_at": { "type": "date" }
12.        }
13.      }
14.    }
15.  }

在文档的映射定义中,我们添加了额外的字段 type。 该字段用于区分存储在同一索引中的不同类型的文档。 我们可以更新和查询这些文档,如下面的代码片段所示。

bash 复制代码
1.  PUT youtube/_doc/user-debraj
2.  {
3.    "type": "user", 
4.    "name": "Debraj Bhal",
5.    "user_name": "debraj",
6.    "email": "[email protected]"
7.  }

9.  PUT youtube/_doc/video-1
10.  {
11.    "type": "video", 
12.    "user_name": "debraj",
13.    "uploaded_at": "2017-10-24T09:00:00Z",
14.    "video_url": "https://myvideo.com"
15.  }

17.  GET youtube/_search
18.  {
19.    "query": {
20.      "bool": {
21.        "must": {
22.          "match": {
23.            "user_name": "debraj"
24.          }
25.        },
26.        "filter": {
27.          "match": {
28.            "type": "video" 
29.          }
30.        }
31.      }
32.    }
33.  }

希望本文能帮助你详细了解 Elasticsearch 中的映射类型。

相关推荐
Kakaxiii4 小时前
【2025最新】gitee+pycharm完成项目的上传与管理
elasticsearch·pycharm·gitee
不学会Ⅳ14 小时前
【吃透 Elasticsearch 的核心原理】学习步骤
大数据·学习·elasticsearch
完美世界的一天1 天前
ES面试题系列「一」
大数据·elasticsearch·搜索引擎·面试·全文检索
好吃的肘子1 天前
ElasticSearch入门详解
java·大数据·elasticsearch·搜索引擎·云原生
极小狐2 天前
如何从极狐GitLab 容器镜像库中删除容器镜像?
java·linux·开发语言·数据库·python·elasticsearch·gitlab
A-花开堪折2 天前
RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
大数据·elasticsearch·搜索引擎
斯普信专业组2 天前
Elasticsearch内存管理与JVM优化:原理剖析与最佳实践
大数据·jvm·elasticsearch
SelectDB技术团队3 天前
可观测性方案怎么选?SelectDB vs Elasticsearch vs ClickHouse
大数据·数据仓库·clickhouse·elasticsearch·信息可视化·doris·半结构化
斯普信云原生组3 天前
Elasticsearch知识汇总之ElasticSearch部署
大数据·elasticsearch·jenkins
老友@3 天前
MySQL 与 Elasticsearch 数据一致性方案
数据库·mysql·elasticsearch·搜索引擎·同步·数据一致性