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 中指定类型名称将搜索限制为一种或多种类型:

GET youtube/user,video/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}

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

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

PUT youtube
{
  "mappings": {
    "user": {
      "properties": {
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" }
      }
    },
    "video": {
      "properties": {
        "video_url": { "type": "text" },
        "user_name": { "type": "keyword" },
        "uploaded_at": { "type": "date" }
      }
    }
  }
}

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

PUT youtube/user/debraj
{
  "name": "Debraj Bhal",
  "user_name": "debraj",
  "email": "debrajbhal@gmail.com"
}

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

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

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

GET youtube/video/_search
{
  "query": {
    "match": {
      "user_name": "debraj"
    }
  }
}

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

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

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

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

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

映射类型的替代方案

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

每个文档类型的索引:

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

自定义类型字段:

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

PUT youtube
{
  "mappings": {
    "_doc": {
      "properties": {
        "type": { "type": "keyword" }, 
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" },
        "video_url": { "type": "text" },
        "uploaded_at": { "type": "date" }
      }
    }
  }
}

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

PUT youtube/_doc/user-debraj
{
  "type": "user", 
  "name": "Debraj Bhal",
  "user_name": "debraj",
  "email": "debrajbhal@gmail.com"
}

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

GET youtube/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "user_name": "debraj"
        }
      },
      "filter": {
        "match": {
          "type": "video" 
        }
      }
    }
  }
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/99302.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何通过网络远程访问电脑?

怎么远程访问公司电脑? “你好,我想通过网络从外面远程访问公司的电脑,这可能吗?您知道如何通过网络远程访问另一台电脑吗?” 借助远程访问工具,我们是可以通过网络远程访问公司电脑的。通过…

PSP - 蛋白质结构预测 OpenFold Multimer 重构训练模型的数据加载

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132602155 OpenFold Multimer 在训练过程的数据加载时,需要将 MSA 与 Template 信息转换成 Feature,再进行训练&#xff0…

电脑前置耳机没声音怎么办

有很多小伙伴反映在将自己的耳机连接到主机前面时没有声音,这是怎么回事呢,遇到这种情况应该怎么解决呢,下面小编就给大家详细介绍一下电脑前置耳机没声音的解决方法,有需要的小伙伴可以来看一看电脑前面耳机没声音。 解决方法&a…

vue项目——表情选择器

组件库地址&#xff1a;https://www.npmjs.com/package/emoji-mart-vue 1、下载 npm install --save emoji-mart-vue 2、引入 import { Picker } from emoji-mart-vueexport default {components: {Picker} }3、使用 <picker set"emojione" /> <picker …

【MySQL系列】索引的学习及理解

「前言」文章内容大致是MySQL索引的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、索引概念二、从硬件角度理解2.1 磁盘2.2 结论 三、从软件角度理解四、共识五、索引的理解5.1 一个现象和结论5.2 对Page进行建模5.3 索引可以采用的数据结构5.…

C - 滑动窗口 /【模板】单调队列

Description 有一个长为 n 的序列 a&#xff0c;以及一个大小为 k 的窗口。现在这个从左边开始向右滑动&#xff0c;每次滑动一个单位&#xff0c;求出每次滑动后窗口中的最大值和最小值。 例如&#xff1a; The array is [1,3,−1,−3,5,3,6,7] and k3。 Input 输入一共有…

【Terraform学习】Terraform动态块基础操作(Terraform模块)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

023 - STM32学习笔记 - 扩展外部SDRAM(二) - 扩展外部SDRAM实验

023- STM32学习笔记 - 扩展外部SDRAM&#xff08;一&#xff09; - 扩展外部SDRAM实验 本节内容中要配置的引脚很多&#xff0c;如果你用的开发板跟我的不一样&#xff0c;请详细参照STM32规格书中说明对相关GPIO引脚进行配置。 先提前对本届内容的变成步骤进行总结如下&…

最简单 实现 Element-ui el-table的懒加载表格数据 el-table懒加载请求数据 element-ui 懒加载

最简单 实现 Element-ui el-table的懒加载表格数据 el-table懒加载请求数据 element-ui 懒加载 1、效果图2、代码 1、效果图 2、代码 <template> <el-table :data"tableData" style"width: 100%" expand-change"expandChange"><…

2分钟搭建FastGPT训练企业知识库AI助理(Docker部署)

我们使用宝塔面板来进行搭建&#xff0c;更方便快捷灵活&#xff0c;争取操作时间只需两分钟 宝塔面板下安装Docker 在【软件商店中】安装【docker管理器】【docker模块】即可 通过Docker安装FastGPT 通过【Docker】【添加容器】【容器编排】创建里新增docker-compose.yaml以下…

内存四区(个人学习笔记黑马学习)

1、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域&#xff1a; 代码区:存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:编译器自动分配释放,存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程…

【LeetCode算法系列题解】第36~40题

CONTENTS LeetCode 36. 有效的数独&#xff08;中等&#xff09;LeetCode 37. 解数独&#xff08;困难&#xff09;LeetCode 38. 外观数列&#xff08;中等&#xff09;LeetCode 39. 组合总和&#xff08;中等&#xff09;LeetCode 40. 组合总和 II&#xff08;中等&#xff09…

[深度学习]1. 深度学习知识点汇总

本文记录了我在学习深度学习的过程中遇到过的不懂的知识点&#xff0c;为了方便翻阅&#xff0c;故将其发表于此&#xff0c;随时更新&#xff0c;供大家参考。 深度学习常见知识点 1. 测试精度和训练精度 在深度学习中&#xff0c;测试精度和训练精度是两个重要的指标&#…

基于空洞卷积DCNN与长短期时间记忆模型LSTM的dcnn-lstm的回归预测模型

周末的时候有时间鼓捣的一个小实践&#xff0c;主要就是做的多因子回归预测的任务&#xff0c;关于时序数据建模和回归预测建模我的专栏和系列博文里面已经有了非常详细的介绍了&#xff0c;这里就不再多加赘述了&#xff0c;这里主要是一个模型融合的实践&#xff0c;这里的数…

面试题——网络IO模型

一、socket socket是在应用层和传输层中间的抽象层&#xff0c;它把传输层&#xff08;TCP/UDP&#xff09;的复杂操作抽象成一些简单的接口&#xff0c;供应用层调用实现进程在网络中的通信。Socket起源于UNIX&#xff0c;在Unix一切皆文件的思想下&#xff0c;进程间通信就被…

【Tkinter界面:练习-01】窗口-部件-布局

一、说明 python在用户界面开发中&#xff0c;其中有QT5&#xff0c;和Tkinter&#xff1b;对于实际项目&#xff0c;界面需要高大上&#xff0c;因此用QT5&#xff0c;对于开发人员的演示程序&#xff0c;或简单程序中&#xff0c;不建议QT5&#xff1b;用Tkinter已经足够。本…

VMware Aria Operations SSH 身份验证绕过漏洞 (CVE-2023-34039)

zhi.oscs1024.com​​​​​ 漏洞类型身份验证不当发现时间2023-08-30漏洞等级严重MPS编号MPS-d9wr-56qmCVE编号CVE-2023-34039漏洞影响广度广 漏洞危害 OSCS 描述VMware Aria Operations for Networks 是 VMware 公司提供的一款网络可视性和分析工具&#xff0c;用于优化网络…

USB fastboot

1 Samsung fastboot flashing unlock 2 bootloader增加解锁密码 diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c index e4d46e4..1b4b450 100755 --- a/app/aboot/aboot.c b/app/aboot/aboot.c -2613,6 2613,20 void cmd_oem_unlock(const char *arg, void *data,…

群晖DS923+扩展ECC 64G内存

1 有必要上64G吗&#xff1f; 如果你不运行大型应用以及安装的套件不多&#xff0c;并且不使用虚拟机&#xff0c;确实没有太大必要。 但是大内存除了这些用处&#xff0c;还会被系统作为缓存使用。在资源监控中查看内存结构&#xff0c;虽然内存利用率只有4%&#xff0c;但缓存…

matlab 计算点云协方差矩阵

目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数输出参数五、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述