Elasticsearch:Explicit mapping - 显式映射

这篇具有很好参考价值的文章主要介绍了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 索引。

Elasticsearch:Explicit mapping - 显式映射
 使用索引 API 创建模式及使用映射 API 更新模式

使用索引 API 进行映射

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

Elasticsearch:Explicit mapping - 显式映射
在创建索引的时候定义映射

让我们为 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 中的数据强制匹配”。

在本文中,我们研究了如何为我们拥有的数据模型控制和创建映射模式。文章来源地址https://www.toymoban.com/news/detail-430724.html

到了这里,关于Elasticsearch:Explicit mapping - 显式映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch学习-索引操作及Mapping映射

    在7.X版本前类似于关系型数据库中的数据库概念,8.X版本后删除了type概念,索引类似于关系型数据库中的表 相当于关系型数据库中的一条数据,最小单元 每一个节点就是一个ES实例(一个java进程),一个节点 != 一台服务器 多个节点组成分布式系统,ES原生分布式,已启动一

    2023年04月22日
    浏览(33)
  • 深入理解Elasticsearch的索引映射(mapping)

    当我们谈论Elasticsearch时,索引映射是一个核心概念,它定义了如何存储和检索数据。在Elasticsearch 7.6及更高版本中,映射提供了一系列强大的功能,使您能够精确地控制数据的结构和行为。本文将详细介绍映射的关键属性、用途以及如何正确设置和优化它。 在Elasticsearch中,

    2024年02月22日
    浏览(37)
  • es elasticsearch 八 mapping 映射 、复杂数据类型

    目录 Mapping 映射 复杂数据类型 Mapping 映射 精确匹配 必须和对应字段值安全一致才可查出 全文检索 缩写搜索全程、格式转换 大小写 同义词 全文检索核心原理 分词,初步的倒排索引的建立 重建倒排索引 时态转换、重复数的转换、同义词的转换、大小写的转换 分词器 analy

    2024年02月07日
    浏览(46)
  • 【Elasticsearch学习笔记二】es的Mapping字段映射、Mapping字段常用类型、Mapping映射的创建、查看和更新、es数据迁移、ik分词器

    目录 1、Mapping字段映射概述 2、Mapping字段常用类型 3、映射中对时间类型详解 1)采取自动映射器来映射 2)手工映射提前指定日期类型 4、ES的keyword的属性ignore_above 5、Mapping映射的查看和创建 1)查看mapping信息:GET 索引名/_mapping 2)创建映射:PUT /索引名 3) 查看所有索引映

    2024年01月20日
    浏览(51)
  • 用于图像恢复的图像层次结构的高效和显式建模Efficient and Explicit Modelling of Image Hierarchies for Image Restoration

    本文的目的是提出一种机制,在 全局、区域和局部 范围内高效、明确地对图像层次结构进行建模,以 进行图像恢复 。为实现这一目标,我们首先分析自然图像的两个重要属性,包括 跨尺度相似性和各向异性图像特征 。受此启发,我们提出了anchored stripe self-attention,它在

    2024年02月06日
    浏览(33)
  • 解决:Springboot启动报错 Whitelabel Error Page: This application has no explicit mapping for

    目录 解决:Spring Boot启动报错 Whitelabel Error Page: This application has no explicit mapping for 问题背景 解决步骤 第一步:检查代码 第二步:检查Spring Boot配置 第三步:检查Controller层 第四步:检查依赖项 第五步:重启应用 总结 @RequestMapping @GetMapping @PostMapping 当我们使用Spring Boot框架开

    2024年02月03日
    浏览(49)
  • 解决错误Whitelabel Error Page This application has no explicit mapping for /error(Method Not Allowed405)

    在提交表单数据的时候,由于控制器controller中mapper处理头映射错误,导致出现PUT405错误代码。 修复的方法有: ①修改URL映射链接和映射方式 ②如果URL没问题的话,可能是没有添加springboot的全局扫描,导致映射失败. 进入SpringbootApplication代码中查看是否添加全局扫描@MapperS

    2024年02月11日
    浏览(41)
  • Visual Studio(2022)生成链接过程的.map映射文件以及.map映射文件的内容说明

    /MAP(生成映射文件) | Microsoft Learn         1. 右键项目属性, 连接器 - 常规 - 启用增量链接,设置为否。如下图:         2. 连接器 - 调试                 生成调试信息  设置为  生成调试信息 (/DEBUG)                 生成程序数据库文件  设置为 指定路径文件名,

    2024年02月10日
    浏览(37)
  • 53.映射 Map

    Map很像对象,对象的键只能是字符串,Map的键可以是任意类型的值(包括对象,数组这种复杂类型的值) 目录 1  创建映射 2  常用实例方法 2.1  添加映射 set() 2.2  获取映射值 get() 2.3  删除映射 delete() 2.4  判断是否有映射 has() 2.5  清除所有映射 clear() 2.6  返回键的遍

    2024年02月15日
    浏览(37)
  • Mapping映射入门

    概念:自动或手动为index中的_doc建立的一种数据结构和相关配置,简称为mapping映射。 插入几条数据,让es自动为我们建立一个索引 对比数据库建表语句 动态映射:dynamic mapping,自动为我们建立index,以及对应的mapping,mapping中包含了每个field对应的数据类型,以及如何分词等

    2023年04月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包