Elasticsearch:Explicit mapping - 显式映射

显式映射相比较动态映射(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 中的数据强制匹配”。

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

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

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

相关文章

使用柔性数组重写MyString

hello,各位宝子,今天阿崽将使用c和柔性数组的方式重新去写String类 在开始本次知识前,首先给大家介绍下柔性数组这个buff特点: 结构中的柔性数组成员前面至少要包含一个其他成员 sizeof返回的这种结构大小不包括柔性数组的内存 …

数据结构课程设计——哈夫曼编/译码器

数据结构课程设计任务书 学生姓名: 专业班级:软件工程 指导教师: 工作单位: 题 目: 哈夫曼编/译码器 基础要求: (1)熟悉各种…

数字信号处理基础(二):FFT和IFFT的使用以及详细分析代码书写思路

目录 1. fft和ifft的原理1.1 fft1.2 ifft 2. 书写代码思路3. 完整代码4. 结果图 1. fft和ifft的原理 1.1 fft fft是快速傅里叶变换,是MATLAB中计算信号频谱的函数,使用方法是fft(x),直接对信号x进行fft计算。 由于fft函数计算信号的频谱是0…

vue3与vue2共存环境搭建

1、全局安装vue2 npm install vue-cli -g2、自行在任意位置创建一个文件夹,局部安装vue3 npm初始化 npm initnpm初始化 提示: 初始化后 出现文件package.json 如果没有初始化 会报错,且文件夹中不会新增内容 3、局部安装vue3 npm install …

宏工科技“全面”发力CIBF,助推电池智造“高效提质”

5月16-18日,第十五届中国国际电池技术展览会(CIBF2023)在深圳盛大举行。宏工科技携电池材料与电池匀浆领域的创新产品和系统解决方案精彩亮相。 据了解,宏工科技在新能源行业的业务涉及电池材料整线产线、电池匀浆、电池回收三个…

R语言实践——rWCVP入门

rWCVP入门 介绍1. 访问到WCVP1.1 方法一1.2 方法二(谨慎) 2. WCVP数据筛选2.1 关于按分类单元筛选的说明2.2 关于按分布区域筛选的说明 笔者实践 介绍 世界维管植物名录(WCVP)是维管植物物种的全球共识。它提供了科学已知的> …

【C语言】结构体指针

结构体指针 结构体基础知识注意对于成员的赋值 结构体指针指向结构体变量的指针结构体指针与结构体成员指针用结构体指针引用结构体成员 结构体 基础知识 初识结构体,可以先看这篇浅显易懂的文章结构体–基础篇 所谓结构体,是一组类型可以不同的相关变…

怎么把录音转文字?推荐你这三款工具

随着科技不断发展,录音转文字的技术也逐渐被广泛应用于各种场景中。其中最常见的一种就是会议记录。在日常工作中,会议是企业和组织中必不可少的一个环节,但在会议过程中的录音和记录往往需要花费大量的时间和精力。这个时候,我们…

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…

架构-软件工程模块-2

系统分析 数据流图可能出案例题,状态转换图了解作用即可 用例图、类图选择题多,暴徒了解即可 #mermaid-svg-lGozbtkYJPEQF1eo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lGozbtkYJPEQF1e…

c++学习——c与c++const修饰的变量的区别

c语言下const修饰的变量 1、c语言下const修饰的变量都有空间 2. c语言的const修饰的全局变量具有外部链接属性 07 const修饰的变量.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h>const int a 10;//常…

解析使用FPGA逻辑实现FIR滤波器的几种架构

有限脉冲响应(finite impulse response&#xff0c;FIR)数字滤波器 一、FIR数字滤波器理论介绍 FIR滤波器的实质就是输入序列与系统脉冲响应的卷积&#xff0c;即&#xff1a; 其中&#xff0c;N为滤波器的阶数&#xff0c;也即抽头数&#xff1b;x(n)为第n个输入序列&#xff…

AI人工智能标记数据的技术:类型、方法、质量控制、应用

AI人工智能 标记数据 在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;标记数据是非常重要的一环。它是指对原始数据进行标记和注释&#xff0c;以便机器学习算法可以理解和利用这些数据。标记数据可以提高机器学习模型的准确…

研发项目工时统计工具哪个好?9大工时管理系统盘点

工时管理是项目型企业的重要需求&#xff0c;特别是在人力成本占比较高的行业&#xff0c;如软件开发、设计咨询、会计律师等。工时管理可以帮助企业核算项目人工成本&#xff0c;控制成本投入&#xff0c;提高项目利润&#xff0c;客观考核员工绩效&#xff0c;优化资源分配等…

HackTheBox-关卡Fawn

1. 连接靶场&#xff0c;打开FAWN实例场景&#xff0c;检查是否互通 TASK1 3 个字母的首字母缩写词 FTP 代表什么&#xff1f; 答案是&#xff1a;File Transfer Protocol TASK2 问题是&#xff1a;FTP服务通常监听哪个端口&#xff1f; FTP监听的TCP端口号为21,监听的数据端…

计算机操作系统(慕课版)第二章课后题答案

一、简答题 (1)什么是前趋图&#xff1f;试画出下面四条语句的前趋图. S1&#xff1a;axy&#xff1b; S2&#xff1a;bz1&#xff1b; S3&#xff1a;ca-b&#xff1b; S4&#xff1a;wc1&#xff1b; 答&#xff1a;前趋图(Precedence Graph)是一个有向无循环图&#xff0c;…

进程控制--进程的等待

回顾 之前我们已经学习了进程的状态和进程的退出如果你没有这些基础知识&#xff0c;应先去了解进程的相关基础知识。 这次我们主要来学习如何让进程等待子进程的退出。 为什么要等待子进程&#xff1f; 之前我们在学习进程的状态的时候&#xff0c;我们知道了进程有一种状态…

spring boot +Sa-Token优雅的实现项目鉴权!

1. 技术选型 最近在做登录、授权的功能&#xff0c;一开始考虑到的是spring boot spring security&#xff0c;但spring security太重&#xff0c;而我们是轻量级的项目&#xff0c;所以&#xff0c;spring security不适合我们。 而后考虑spring boot shiro&#xff0c;但s…

ChatGPT ✖️ 前端 = 有点er意思

HOT! HOT! HOT! &#x1f525; &#x1f525; &#x1f525; ChatGPT登上了国内各大平台的热搜榜&#xff0c;应该在去年11月末的时候就有不少同学了解并使用过&#xff0c;那个时候它刚刚问世&#xff0c;在互联网圈子里有了很大的热度&#xff0c;但是对于大众来说&#xff…

fastapi基础篇

文章目录 简介环境搭建安装基础文件自动文档 基础使用POST请求传递参数返回定制信息jinja2返回html 简介 FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 3.6 并基于标准的 Python 类型提示。 关键特性 快速&#…