【Elasticsearch】Mapping概述

以下是Elasticsearch中提到的关于Mapping的各模块概述:

 

---

1.Dynamic mapping(动态映射)

动态映射是指Elasticsearch在索引文档时,自动检测字段类型并创建字段映射的过程。当你首次索引一个文档时,Elasticsearch会根据字段的值类型(如字符串、数字、日期等)自动推断字段的映射类型。例如:

• 字符串字段会被自动映射为`text`或`keyword`类型。

• 数字字段会被映射为`integer`、`long`等类型。

• 日期字段会被映射为`date`类型。

动态映射的优点是方便快捷,但缺点是可能导致意外的字段类型推断,因此在生产环境中通常建议显式定义映射。

---

2.Explicit mapping(显式映射)

显式映射是指在索引创建时,手动定义字段的映射类型和参数。通过显式映射,你可以精确控制字段的存储方式、分析器、是否可搜索等属性。例如:

```json

PUT /my_index

{

  "mappings": {

    "properties": {

      "name": { "type": "text" },

      "age": { "type": "integer" },

      "created_at": { "type": "date" }

    }

  }

}

```

显式映射适用于需要对字段进行精细控制的场景,例如自定义分词器、设置字段是否存储等。

---

3.Runtime fields(运行时字段)

运行时字段是一种在查询时动态计算的字段,而不是在索引时存储的字段。运行时字段可以基于已有的字段进行计算或转换,例如:

• 将字符串字段转换为日期格式。

• 根据多个字段的值计算一个新字段。

运行时字段的优点是灵活性高,但可能会对查询性能产生一定影响,因为每次查询都需要动态计算字段值。

---

4.Field data types(字段数据类型)

字段数据类型定义了字段可以存储的数据格式和行为。Elasticsearch支持多种数据类型,包括:

• 核心数据类型:如`text`、`keyword`、`integer`、`float`、`date`等。

• 复杂数据类型:如`object`、`nested`、`geo_point`等。

• 特殊数据类型:如`ip`、`binary`、`completion`等。

选择合适的数据类型对于优化存储和查询性能至关重要。

---

5.Metadata fields(元数据字段)

元数据字段是Elasticsearch自动为每个文档添加的特殊字段,用于存储文档的元信息。常见的元数据字段包括:

• `_id`:文档的唯一标识符。

• `_index`:文档所属的索引名称。

• `_type`:文档的类型(在7.x及以后版本中已被废弃)。

• `_source`:存储原始JSON文档。

• `_timestamp`:文档的创建时间戳。

这些字段通常用于管理和查询文档的元信息。

---

6.Mapping parameters(映射参数)

映射参数是用于定义字段行为的额外配置。常见的映射参数包括:

• `index`:指定字段是否可搜索。

• `store`:指定字段是否存储在索引中。

• `analyzer`:指定字段使用的分词器。

• `norms`:是否启用字段的规范化。

• `copy_to`:将字段的值复制到另一个字段。

通过这些参数,可以对字段的行为进行更细致的控制。

---

7.Mapping limit settings(映射限制设置)

映射限制设置用于控制索引的映射复杂度,以防止索引过大或过于复杂。常见的限制设置包括:

• `index.mapping.nested_fields.limit`:限制嵌套字段的数量。

• `index.mapping.nested_objects.limit`:限制嵌套对象的深度。

• `index.mapping.total_fields.limit`:限制索引中字段的总数。

• `index.mapping.depth.limit`:限制字段嵌套的深度。

这些设置有助于优化索引性能和资源使用。

---

8.Removal of mapping types(移除映射类型)

在Elasticsearch 7.x及以后版本中,`_type`字段已被废弃并移除。在早期版本中,`_type`用于区分同一索引中的不同文档类型,但在新版本中,Elasticsearch建议使用单独的索引来代替类型的概念。移除`_type`的主要原因是简化索引结构,减少复杂性,并提高性能。

Elasticsearch 的mapping(映射)是定义文档及其字段如何存储和索引的过程。它类似于传统数据库中的表结构定义,但在 Elasticsearch 中,映射更加灵活且具有动态性。以下是关于 Elasticsearch 映射的详细说明,包括其核心概念、主要功能以及如何使用它来优化数据存储和查询性能。


---

1.映射的作用
在 Elasticsearch 中,映射定义了以下几个关键内容:

• 字段的存储方式:字段的数据类型(如`text`、`keyword`、`integer`、`date`等)。

• 字段的索引方式:字段是否可搜索、是否存储原始值、是否进行分词等。

• 元数据字段:如`_source`、`_id`、`_index`等,用于管理文档的元信息。

• 字段的额外配置:如是否启用规范化(`norms`)、是否支持多字段(`multi-fields`)等。


---

2.映射的类型
Elasticsearch 提供了多种映射方式,以满足不同的需求。


2.1 动态映射(Dynamic Mapping)
动态映射允许 Elasticsearch 自动检测字段的数据类型并创建映射。当你首次索引一个文档时,Elasticsearch 会根据字段的值类型自动推断字段的映射类型。例如:

• 字符串字段会被自动映射为`text`或`keyword`。

• 数字字段会被映射为`integer`或`long`。

• 日期字段会被映射为`date`。

优点:

• 方便快捷,适合快速开发和原型设计。

• 自动适应新字段,无需手动定义。

缺点:

• 可能导致意外的字段类型推断。

• 不适合对性能和存储有严格要求的场景。

动态模板(Dynamic Templates):
你可以通过动态模板定义自定义映射规则,基于字段名称或数据类型匹配条件来应用特定的映射。例如:

```json
PUT /my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": { "type": "keyword" }
        }
      }
    ]
  }
}
```

在上述例子中,所有字符串字段都会被自动映射为`keyword`类型。


---

2.2 显式映射(Explicit Mapping)
显式映射允许你在索引创建时手动定义字段的映射类型和参数。这种方式提供了更高的灵活性和控制力。例如:

```json
PUT /my_index
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "age": { "type": "integer" },
      "created_at": { "type": "date" },
      "location": { "type": "geo_point" }
    }
  }
}
```


优点:

• 精确控制字段的存储和索引方式。

• 避免动态映射可能导致的类型推断错误。

• 适合生产环境和对性能要求较高的场景。

缺点:

• 需要提前定义字段,不够灵活。


---

2.3 运行时字段(Runtime Fields)
运行时字段是一种在查询时动态计算的字段,而不是在索引时存储的字段。它们可以基于已有的字段进行计算或转换。例如:

```json
PUT /my_index/_mapping
{
  "runtime": {
    "day_of_week": {
      "type": "keyword",
      "script": "emit(doc['created_at'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
    }
  }
}
```

在上述例子中,`day_of_week`字段会在查询时动态计算文档的`created_at`字段对应的星期几。

优点:

• 灵活性高,无需重新索引即可添加新字段。

• 可以基于已有字段进行复杂计算。

缺点:

• 查询性能可能受到影响,因为每次查询都需要动态计算字段值。


---

3.映射的组件
Elasticsearch 的映射由以下几个关键组件组成:


3.1 字段(Fields)
字段是文档的基本单元,每个字段都有自己的数据类型。Elasticsearch 支持多种数据类型,包括:

• 核心数据类型:`text`、`keyword`、`integer`、`float`、`date`、`boolean`等。

• 复杂数据类型:`object`、`nested`、`array`等。

• 特殊数据类型:`geo_point`、`geo_shape`、`ip`、`completion`等。


3.2 元数据字段(Metadata Fields)
元数据字段是 Elasticsearch 自动为每个文档添加的特殊字段,用于存储文档的元信息。常见的元数据字段包括:

• `_id`:文档的唯一标识符。

• `_index`:文档所属的索引名称。

• `_source`:存储原始 JSON 文档。

• `_timestamp`:文档的创建时间戳。


3.3 映射参数(Mapping Parameters)
映射参数是用于定义字段行为的额外配置。常见的映射参数包括:

• `index`:指定字段是否可搜索。

• `store`:指定字段是否存储在索引中。

• `analyzer`:指定字段使用的分词器。

• `norms`:是否启用字段的规范化。

• `copy_to`:将字段的值复制到另一个字段。


3.4 多字段(Multi-Fields)
多字段允许你将同一个字段以不同的方式索引。例如,你可以将一个字符串字段同时索引为`text`和`keyword`,以满足全文搜索和排序/聚合的需求。例如:

```json
PUT /my_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "keyword": { "type": "keyword" }
        }
      }
    }
  }
}
```

在上述例子中,`name`字段被索引为`text`类型,同时通过`fields`添加了一个`keyword`多字段。


---

4.映射的管理
Elasticsearch 提供了多种工具和 API 来管理映射。


4.1 创建索引和映射
在创建索引时,可以显式定义映射:

```json
PUT /my_index
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "age": { "type": "integer" }
    }
  }
}
```

4.2 更新映射
使用Update Mapping API可以更新现有的映射。例如,添加新字段:

```json
PUT /my_index/_mapping
{
  "properties": {
    "email": { "type": "keyword" }
  }
}
```

4.3 获取映射
使用Get Mapping API可以查看索引的映射定义:

```json
GET /my_index/_mapping
```

---

5.防止映射爆炸
在 Elasticsearch 中,定义过多字段可能导致映射爆炸(Mapping Explosion),这可能会导致内存不足错误,并且很难恢复。为了避免这种情况,可以使用以下策略:

• 限制字段数量:通过设置`index.mapping.total_fields.limit`参数限制索引中字段的总数。

• 限制嵌套深度:通过设置`index.mapping.depth.limit`参数限制字段嵌套的深度。

• 谨慎使用动态映射:避免每条新文档都引入新字段,尽量在索引创建时显式定义字段。


---

6.移除映射类型(Removal of Mapping Types)
在 Elasticsearch 7.x 及更高版本中,`_type`字段已被废弃并移除。在早期版本中,`_type`用于区分同一索引中的不同文档类型,但在新版本中,Elasticsearch 建议使用单独的索引来代替类型的概念。移除`_type`的主要原因是简化索引结构,减少复杂性,并提高性能。


---

7.映射的优化建议
为了优化 Elasticsearch 的映射,可以遵循以下最佳实践:

• 显式定义字段:尽量使用显式映射,避免动态映射可能导致的类型推断错误。

• 使用多字段:根据需求将字段索引为多种类型,以满足不同的查询需求。

• 限制字段数量:避免过多字段导致映射爆炸。

• 选择合适的数据类型:例如,使用`keyword`而非`text`进行排序或聚合。

• 使用运行时字段:在不重新索引的情况下进行模式更改。


---

总结
Elasticsearch 的映射是定义文档结构和字段行为的核心机制。通过动态映射、显式映射和运行时字段,你可以灵活地管理数据的存储和索引方式。合理设计映射

---

如果你对某个模块有更深入的问题,欢迎继续提问!

 

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

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

相关文章

java商城解决方案

数字化时代,电子商务已成为企业拓展市场的重要渠道。对于想要建立在线商店的企业来说,选择正确的技术堆栈至关重要。 Java作为一种成熟且广泛使用的编程语言,为构建购物中心提供了强大的功能和灵活性。 商城Java源码:商城开发的核…

SSM开发(十二) mybatis的动态SQL

目录 一、为什么需要动态SQL? Mybatis 动态 sql 是做什么的? 二、多种动态 SQL 元素 三、示例 1、model定义 2、数据库定义 3、UserMapper接口及UserMapper.xml内容定义 if标签 choose/when/otherwise 标签 foreach标签 trim 标签 四、动态SQL注意 一、为什么需…

HCIA项目实践---OSPF的知识和原理总结

9.5 OSPF 9.5.1 从哪些角度评判一个动态路由协议的好坏? (1)选路佳(是否会出环) OSPF 协议采用链路状态算法,通过收集网络拓扑信息来计算最短路径,从根本上避免了路由环路的产生。 &#xff08…

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 (所搭环境如上图所示) A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址,再进入环回接口配置IP地址) (配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址) (置R3路由器的0/0/0接…

github上创建person access token

在 GitHub 上创建 Personal Access Token(PAT) 时,权限设置非常重要。正确的权限设置可以确保 Token 能够访问所需的资源,同时避免授予过多权限带来的安全风险。以下是详细的权限设置说明: 1. 进入 Token 创建页面 登录…

【网络编程】之Udp网络通信步骤

【网络编程】之Udp网络通信步骤 TCP网络通信TCP网络通信的步骤对于服务器端对于客户端 TCP实现echo功能代码实现服务器端getsockname函数介绍 客户端效果展示 对比两组函数 TCP网络通信 TCP网络通信的步骤 对于服务器端 创建监听套接字。(调用socket函数&#xff…

【教程】MySQL数据库学习笔记(七)——多表操作(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…

国自然地区基金|影像组学联合病理组学预测进展期胃癌术后预后的研究|基金申请·25-02-13

小罗碎碎念 今天和大家分享一个国自然地区科学项目,执行年限为2020.01~2023.12,直接费用为34万元。 胃癌在我国发病形势严峻,现有TNM分期预后评估存在局限,难以满足精准医疗需求。本项目运用“医工结合,学科…

nvm下载安装教程(node.js 下载安装教程)

前言 nvm 官网地址:https://nvm.uihtm.com nvm 是一个 node.js 的版本管理工具,相比于仅安装 node.js,我们可以使用 nvm 直接下载或卸载 node.js,可以同时安装多个 node.js 版本,并动态的切换本地环境中的 node.js 环…

项目BUG

项目BUG 前言 我创作这篇博客的目的是记录学习技术过程中的笔记。希望通过分享自己的学习经历,能够帮助到那些对相关领域感兴趣或者正在学习的人们。 项目BUG 1.低频率信号(100k或 200K以下)可以直接用一根导线焊接出几根导线来分几路,高频率信号只能…

Apollo 9.0 速度动态规划决策算法 – path time heuristic optimizer

文章目录 1. 动态规划2. 采样3. 代价函数3.1 障碍物代价3.2 距离终点代价3.3 速度代价3.4 加速度代价3.5 jerk代价 4. 回溯 这一章将来讲解速度决策算法,也就是SPEED_HEURISTIC_OPTIMIZER task里面的内容。Apollo 9.0使用动态规划算法进行速度决策,从类名…

吴恩达深度学习——词嵌入

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 词表特征词嵌入的类比推理嵌入矩阵词嵌入Word2Vec跳字模型模型细节负采样 GloVe词向量(了解) 情绪分类 词表特征 使用 one-hot 对词汇进行编码时&#x…

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 (1)创建Makefile文件 (2)编译规则 (3)编译 (4)变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…

达梦:TPCC 压测

目录 造数1. 脚本启动2. 检查数据库信息3. 删除旧用户和表空间4. 创建新的表空间5. 创建用户和表6. 数据加载7. 创建索引8. 创建存储过程和序列9. 检查数据空间使用情况10. 启用表的快速访问池11. 数据加载完成总结 压测1. 脚本启动2. 检查数据表空间3. 设置表的快速池标志4. 检…

2024 StoryDiffusion 文字/文字+图像----->视频

基于扩散模型的生成模型在生成长序列图像和视频时面临内容一致性的重大挑战,尤其是涉及复杂主题和细节的场景中,角色身份、服饰风格等元素难以保持连贯。传统方法通常依赖潜在空间的运动预测,但长视频生成时易出现不稳定性。针对这些问题&…

在带有Intel Arc GPU的Windows上安装IPEX-LLM

在带有Intel Arc GPU的Windows上安装IPEX-LLM 在带有Intel Arc GPU的Windows上安装IPEX-LLM先决条件安装 GPU 驱动安装 Visual Studio 2022 社区版安装 Intel oneAPI Base Toolkit安装 IPEX-LLM创建虚拟环境环境验证 可能遇到的问题 在带有Intel Arc GPU的Windows上安装IPEX-LL…

流程控制(if—elif—else,while , for ... in ...)

1. 流程控制 流程:计算机执行代码的顺序 流程控制:对计算机执行代码的顺序的管理 2. 流程控制分类 流程控制分类: 顺序流程:自上而下的执行结构,即 Python 默认流程 选择/分支流程:根据某一步的判断&am…

SpringBoot实战:高效获取视频资源

文章目录 前言技术实现SpringBoot项目构建产品选取配置数据采集 号外号外 前言 在短视频行业高速发展的背景下,海量内容数据日益增长,每天都有新的视频、评论、点赞、分享等数据涌现。如何高效、精准地获取并处理这些庞大的数据,已成为各大平…

SSL域名证书怎么申请?

在数字化时代,网络安全已成为企业和个人不可忽视的重要议题。SSL(Secure Sockets Layer,安全套接层)域名证书,作为保障网站数据传输安全的关键工具,其重要性日益凸显。 一、SSL域名证书:网络安…

用大模型学大模型04-模型与网络

目前已经学完深度学习的数学基础,开始学习各种 模型和网络阶段,给出一个从简单到入门的,层层递进的学习路线。并给出学习每种模型需要的前置知识。增加注意力机制,bert, 大模型,gpt, transformer, MOE等流行…