Elasticsearch:Explicit mapping - 显式映射

news2024/11/13 15:17:49

显式映射相比较动态映射(Dynamic mapping)是需要我们在索引创建时就定义字段及其类型。这个和我们传统的 RDMS 数据库一样,在我们写入数据到数据库之前,我们需要工整地定义好每个字段及其类型和长度。Elasticsearch 既可以使用显式映射也可以同时使用动态映射。在许多的应用场景中,如果我们事先知道索引的字段及其类型,那么使用显式映射无疑会使得我们提供索引的速度,因为 Elasticsearch 不会为额外推算新字段的类型而花费时间以及节点之间的同步。这样会减少主节点的计算量。

Elasticsearch 可以智能地根据我们的文档导出映射信息,但是,有可能会以错误的模式定义结束。 幸运的是,Elasticsearch 为我们(用户)提供了方式和方法,以我们想要的方式以索引和映射 API 的形式指定映射定义。

下面列出了两种显式创建(或更新)模式(schema)的可能方法。

  • 索引 API:为此,我们可以使用 create index API(不是 mapping API,注意)在创建索引时创建模式定义。 创建索引 API 需要一个包含 JSON 文档形式的所需 schema 定义的请求。 这样,一个新的索引和它的映射定义都是一次性创建的。
  • 映射 API:随着我们的数据模型的成熟,有时需要使用新属性更新模式定义。 Elasticsearch 提供了一个 _mapping 端点来执行此操作,允许我们添加其他字段及其数据类型。 我们也可以第一次使用此 API 将模式添加到新创建的索引中。

例如,请看下图,它演示了如何使用这两个 API 创建 movies 索引。

 使用索引 API 创建模式及使用映射 API 更新模式

使用索引 API 进行映射

在创建索引时创建映射定义相对简单。 我们只需在索引名称后发出一个 PUT 命令,并将包含所有必填字段及其详细信息的映射对象作为请求的主体传递。 下图直观地解释了成分。 

在创建索引的时候定义映射

让我们为 employee 模型开发一个映射模式 —— 员工信息被建模为一堆字段,如 name、age、email 和 address。

我们通过 HTTP PUT 操作调用映射 API,将包含这些字段的文档索引到 employees 索引中。 请求正文封装了我们字段的属性,如下所示。

# Creating an employees schema upfront
PUT employees
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "mmail": {
        "type": "keyword"
      },
      "address": {
        "properties": {
          "street": {
            "type": "text"
          },
          "country": {
            "type": "text"
          }
        }
      }
    }
  }
}

脚本准备就绪后,使用 Kibana 的 DevTools 执行此命令。 你应该会收到一个成功的响应,表明索引已创建。 在这个例子中,我们将类型指定给 Elasticsearch; 现在我们可以控制模式。

你是否注意到列表中的 address 字段? 它是一种对象类型,由附加字段、street 和 country 组成。 需要注意的一件重要事情是,adress 字段的类型并没有被提及为对象(object)类型,尽管我们说它是封装其他数据字段的对象。 这样做的原因是 Elasticsearch 默认为任何内部对象推导出对象数据类型。 此外,包含在地址中的子字段 properties 对象有助于定义内部对象的更多属性。

现在我们在生产中有了我们的 employees 索引,假设我们想要扩展模型以具有更多属性,例如部门、电话号码等。 为了满足这一要求,我们需要在实时索引上使用 _mapping API 添加这些附加字段。

使用 mapping API 更新模式

随着我们项目的成熟,数据模型无疑也会发生变化。 对于我们的员工文档,我们可能想要添加几个属性,如以下代码片段中所示的 joining_date 和 phone_number。

# Additional data to the existing Employee document
{   
 "name":"John Smith",   
 "joining_date":"01-05-2021",    
 "phone_number":"01234567899"   
 ... 
}

入职日期(joining_date)是一个 date 类型,因为我们要进行与日期相关的操作,比如按入职日期对员工进行排序。 电话号码应按原样存储,因此它符合 keyword 数据类型。 为了使用这些附加字段修改现有员工的模式定义,我们在现有索引上调用 _mapping 端点,在请求对象中声明新字段,如下面的清单所示。

# Updating the existing index with additional fields
PUT employees/_mapping  
{   
 "properties":{     
  "joining_date":{        
   "type":"date",       
   "format":"dd-mm-yyyy"      
   },     
  "phone_number":{       
   "type":"keyword"      
   }   
 } 
}

如果你仔细查看请求正文,就会发现 properties 对象是在根级别定义的,这与使用索引 API 创建模式的方法相反,在索引 API 这种方法中,properties 对象被包装在根级别 mappings 对象中。

更新空索引

我们也可以使用相同的原则在空索引上更新架构。 空索引是在没有任何模式映射的情况下创建的索引 —— 例如,执行 PUT books 命令会创建一个没有模式关联的空 books 索引。

PUT books

类似于通过调用具有所需模式定义的 _mapping 端点来更新索引的机制,我们也可以对空索引使用相同的方法。 以下代码片段使用几个字段更新 departments 索引的模式:

# Adding the mapping schema to an empty index
PUT departments/_mapping  
{   
 "properties":{     
  "name":{       
   "type":"text"      
  }   
 } 
}

我们已经看到了使用附加字段更新模式的附加情况。 但是如果我们想改变现有字段的数据类型怎么办?

不允许修改现有字段

一旦索引生效(索引是用一些数据字段创建的并且可以运行),就禁止对实时索引上的现有字段进行任何修改。 例如,如果一个字段被定义为 keyword 数据类型并被索引,则它不能更改为不同的数据类型(例如,从 keyword 到 text 数据类型)。 不过,这是有充分理由的。

数据使用现有模式定义进行索引,因此存储在索引中。 如果数据类型已被修改,则对该字段数据的搜索将失败,这会导致错误的搜索体验。 为了避免搜索失败,Elasticsearch 不允许我们修改已有的字段。

那么,你可能会问,还有什么选择呢? 业务需求随着技术需求的变化而变化。 我们如何在实时索引上修复数据类型(也许,我们一开始就错误地创建了它们)? 重新索引是我们的朋友。

在有些情况下,加入你已经定了一个 text 类型的字段,但是你在之后想对这个字段进行聚合。那么你该怎么办呢?你可以详细阅读文章 “Elasticsearch:如何使 Elasticsearch 和 Kibana 中的文本字段可聚合?”。

重新索引数据

这是我们使用重新索引(reindex)技术的地方。 重新索引操作将数据从原始索引获取到具有更新模式定义的新索引。 我们的想法是:

  1. 使用更新的模式定义创建新索引。
  2. 使用 reindex API 将数据从旧索引复制到新索引中。 一旦重新索引完成,具有新模式的新索引就可以使用了。 索引对读取和写入操作都是开放的。
  3. 一旦新索引准备就绪,我们的应用程序就会切换到新索引。
  4. 一旦我们确认新索引按预期工作,我们就会搁置旧索引。

重新索引是一项功能强大的操作。你可以详细阅读文章 “Elasticsearch: Reindex 接口”。但让我简要介绍一下 API 的工作原理。 假设我们希望将数据从现有(source)索引迁移到目标(dest)索引,我们发出重建索引调用,如下面的代码所示:

# Migrating data to a new index with new schema
POST _reindex
{
  “source”: {“index”: “orders”},
  “dest”: {“index”: “orders_new”}
}

新索引 orders_new 可能是通过对模式的更改创建的,然后来自旧索引(orders)的数据被迁移到这个新创建的索引并更新了声明。

别名在迁移中起着重要作用

如果你的应用程序与现有索引紧密相关,则迁移到新索引可能需要更改代码或配置。 例如,在上面的例子中,所有指向 orders 索引的查询现在都将针对新创建的 orders_new 索引执行 —— 这可能需要更改代码。

避免这种情况的理想方法是使用别名。 别名是给索引的替代名称。 别名帮助我们在索引之间无缝切换,停机时间为零。 你可以详细阅读文章 “Elasticsearch:如何轻松安全地对实时 Elasticsearch 索引重新索引你的数据”。

类型强制 - type coercion

有时,在为文档建立索引时,数据的类型可能不正确 —— 整数定义的字段可能会使用字符串值进行索引。 Elasticsearch 尝试转换这种不一致的类型,从而避免索引问题。 这是一个称为类型强制(type coercion)的过程

举个例子:一个 float 类型的 rating 字段可能收到一个用字符串括起来的值:"rating": "4.9" 而不是 "rating": 4.9。 Elasticsearch 在遇到数据类型的不匹配值时是宽容的。 它通过提取值并将其存储在原始数据类型中来索引文档。请详细阅读文章 “Elasticsearch:Elasticsearch 中的数据强制匹配”。

在本文中,我们研究了如何为我们拥有的数据模型控制和创建映射模式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】二叉搜索树(概念、实现、应用)

前言: 此前我们在C语言实现数据结构的时候学习过二叉树,但是那个时候我们没有深入学习二叉搜索树。本章重提二叉树并详解二叉搜索树有下面两个原因: 1、为我们下一章学习set和map做准备;2、详解我们进阶一点的二叉树的面试OJ题&a…

【C++学习】日积月累——二叉搜索树详解

一、二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上…

程序员常用的代码比较工具,你更喜欢哪款?

目录 💡 Linux 命令行的对比工具 一. diff 二. vimdiff命令 💡 GUI 比对工具 三. WinMerge 四. Diffuse 五. Code Compare 六. Beyond Compare 七. UltraCompare 八. Altova DiffDog 九. Kompare 十. Meld 十一. XXdiff 十二. KDiff3 十…

拓扑排序模板及例题

概念 一个有向无环图必然存在一个拓扑序列与之对应。 流程: 先将所有入度为0的节点入队将队列中的节点出队,出队序列就是对应拓扑序。对于弹出的节点x,遍历x所有出度y,对y进行入读减一操作检查入度减一之后的节点y,…

慈航公益·高莞乡情行

2023年4月9日,慈航公益高莞乡情行---高村陈屋第二届“敬老睦宗情暖乡土”活动日暨“英华教育奖学基金”成立大会在高村陈屋如期举行。 高村陈屋位于河源市连平县境内,为了赶上10点开始的活动,清晨六点半,志愿者们便从慈航出发&am…

12电感的应用

目录 一、电源电路使用 1、设计实例 二、高频电路中使用 1、选择Q值高的电感器 2、选择自谐振频率高的电感器 3、选择电感偏差小的电感器 三、控制振荡频率 四、确保高频信号的隔离 五、共模轭流线圈 一、电源电路使用 如式(5)所示,…

数码照片管理系统Damselfly

什么是 Damselfly ? Damselfly 是一个基于服务器的数码照片管理系统。Damselfly 旨在管理基于文件夹的大型照片集合,特别关注快速搜索和关键字标记工作流程。Damselfly 包含强大的机器学习功能,可帮助您识别照片及其主体,包括人脸…

使用Socks5代理保障Windows网络安全

摘要:Socks5代理是一种在Windows系统中保障网络安全的有效方法。本文将详细介绍什么是Socks5代理,以及如何在Windows系统中使用Socks5代理来加强网络安全。同时,我们还将探讨如何编写代码来使用Socks5代理来保障应用程序的网络安全。 正文&am…

报表VS分析:为什么报表做不完?老板到底想要什么?

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维数据分析,通过数据讲故事。 上一讲和大家讲了分析模型中的战斗机——财务分析模型。通过奥威BI软件的行计算模型来开发财务分析报表异常地简单,…

安装Django

1. 在物理环境安装Django Python官方的PyPi仓库为我们提供了一个统一的代码托管仓库,所有的第三方库,甚至你自己写的开源模块,都可以发布到这里,让全世界的人分享下载 pip是最有名的Python包管理工具 。提供了对Python包的查找、…

Linux 动态库的制作与使用

目录 动态库的制作和使用 动态库的制作和使用 原始结构如下: 先进入calc文件,并生成与位置无关的.o文件 接着生成动态文件库,使用ll指令可以看到,库名为绿色,linux中绿色的文件一般都是可执行文件 将其生成的lib…

如何快速搭建一个SpringBoot项目

前面我们了解了SpringBoot背景和特点,本节我们主要介绍如何快速构建一个SpringBoot项目,以此来提升日常开发效率。 SpringBoot是搭建应用的手脚架,由Spring公司的核心团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。…

如何平衡倾斜摄影的三维模型轻量化数据文件大小和质量效果?

如何平衡倾斜摄影的三维模型轻量化数据文件大小和质量效果? 倾斜摄影超大场景的三维模型数据文件大小的具体范围取决于多种因素,如原始数据的复杂度、轻量化处理的方式和压缩算法等。一般而言,经过轻量化处理后,数据文件大小可以减…

centos7安装nginx及uwsgi部署django项目

1、安装配置uwsgi pip install uwsgi 2、在项目根目录下创建image_ocr_uwsgi.ini配置文件 [uwsgi] # 对外提供http服务的端口 http :9000 # 用于和nginx进行数据交互的端口 socket 127.0.0.1:8001 # django程序的主目录 chdir /home/image_process/image_ocr/image_ocr #…

【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI

目录 0x00 响应时间和吞吐量(Response Time and Throughput) 0x01 相对性能(Relative Performance) 0x02 执行时间测量(Measuring Execution Time) 0x03 CPU 时钟(Clocking) 0x…

【RabbitMQ】| 狮子带你(超详细)原生Java操作兔子队列

目录 一. 🦁 前言二. 🦁 原生Java操作RabbitMQⅠ. 简单模式1. 添加依赖2. 编写生产者3. 编写消费者 Ⅱ. 工作队列模式1. 编写生产者2. 编写消费者3. 实现 Ⅲ. 发布订阅模式1. 编写生产者2. 编写消费者 Ⅳ. 路由模式1. 编写生产者2. 编写消费者 Ⅴ. 通配符…

SpringCloud源码之Spring Cloud Common核心接口说明

spring cloud commons spring cloud提供的通用抽象包,组件的实现基本上都依赖于当前包的接口定义实现功能,下面就是梳理一下当前包中都提供了哪些比较重要的接口 1. 服务注册 1.1 DiscoveryClient DiscoveryClient 是一个顶级的接口类,用…

node项目的建立

文章目录 1.node项目的建立1.1项目初始化1.2 安装express1.3 初始化服务器 2.配置跨域2.1安装cors2.2cors的引入(app.js中) 3.初始化路由3.1新建文件3.2初始路由模块3.3app.js注册3.4 在postman测试 4.抽离路由处理模块3.1 在router_handler新建user.js3…

为什么LC谐振频率附近信号会被放大

这个是LC低通滤波电路, 它的增益曲线是这样的 很多同学不理解为什么谐振频率附近信号会被放大,今天就来聊一聊为什么谐振频率附近信号会被放大。 看到这个LC低通滤波电路,假设输入信号源内阻为Rs,L和C为理想电感和电容&#xff0…

Jmeter(五)_CSV Data参数化,Beanshell

一.CSV Data Set Config 准备好一个txt文件,写入如下内容,第一行可以不写,写了的话也会作为一组数据被运行: 然后把后缀名改为CSV,这样一个参数化文件就准备好了 然后打开jmeter,在需要使用这个参数化…