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

---

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何构建一个AI驱动的前端UI组件生成器

前言 本文将教您如何构建一个AI驱动的前端UI组件生成器,它可以帮助您生成Next.js Tailwind CSS UI组件,并提供实现教程。我们将涵盖以下内容: 使用Next.js、TypeScript和Tailwind CSS构建UI组件生成器Web应用程序。 使用CopilotKit将AI功能…

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 框架! Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet&#…

Linux | 进程相关概念(进程、进程状态、进程优先级、环境变量、进程地址空间)

文章目录 进程概念1、冯诺依曼体系结构2、进程2.1基本概念2.2描述进程-PCB2.3组织进程2.4查看进程2.5通过系统调用获取进程标识符2.6通过系统调用创建进程-fork初识fork の 头文件与返回值fork函数的调用逻辑和底层逻辑 3、进程状态3.1状态3.2进程状态查看命令3.2.1 ps命令3.2.…

超越DeepSeek R1的Moe开源大模型 Qwen2.5-max 和 Qwen Chat Web UI 的发布,阿里搅动AI生态

敲黑板,说重点,最近阿里推出的 Qwen2.5-max 和 Qwen Chat Web UI,将对AI生态又一次冲击。 说冲击,因为 DeepSeek R1的热潮还未散退的情况下,由于服务器压力不能注册新的API,然后价格涨价,服务有…

无公网IP可实现外网访问开发速查备忘录 Quick Reference

Quick Reference 是一款为开发人员准备的快速参考和备忘清单,涵盖了各种编程语言、框架、工具和命令行工具的常用语法和用法。目的就是为了开发人员在开发时方便技术栈查阅,提高开发者的开发效率。 本文将详细的介绍如何利用 Docker 在本地部署 Quick Re…

【ARM】JTAG接口介绍

1、 文档目标 对 JTAG 接口有更多的认识,在遇到关于 JTAG 接口问题时有一些排查的思路。 2、 问题场景 在使用调试器过程时,免不了要接触到 JTAG 接口,当出现连接不上时,就不知道从哪来进行排查。 3、软硬件环境 1 软件版本&am…

两步在 Vite 中配置 Tailwindcss

第一步:安装依赖 npm i -D tailwindcss tailwindcss/vite第二步:引入 tailwindcss 更改配置 // src/main.js import tailwindcss/index// vite.config.js import vue from vitejs/plugin-vue import tailwindcss from tailwindcss/viteexport default …

Threadlocal的实现原理

文章目录 ThreadLocal与Thread关系分析Threadlocal 不支持继承性lnheritableThreadLocal 类 ThreadLocal与Thread关系分析 由该图可知, Thread 类中有一个 threadLocals 和一个 inheritableThreadLocals , 它们 都是 ThreadLocalMap 类型 的变量 &#x…

arm linux下的中断处理过程。

本文基于ast2600 soc来阐述,内核版本为5.10 1.中断gic初始化 start_kernel() -> init_IRQ() -> irqchip_init() of_irq_init()主要是构建of_intc_desc. 489-514: 从__irqchip_of_table中找到dts node中匹配的of_table(匹配matches->compatible)&#xf…

oracle使用动态sql将多层级组织展平

ERP或者其他企业管理软件中都会有一张组织机构表,可以写固定sql的方式将其展平获取组织表中的字段信息,如负责人、上级组织负责人、分管领导、成立时间等。但是这种方式有个缺陷,就是如果只写到处理4个层级,那么后期层级增多就无法…

layui怎么请求数据

layui怎么请求数据 ​编辑 下次还敢 发布: 2024-04-04 03:30:19 原创 1152人浏览过 Layui 提供四种数据请求方式:$.ajax() Ajax 方式Fetch API 方式layui 内置 Ajax 方式layui 内置请求方式,用于监听提交事件 Layui中请求数据的几种方式…

mybatis-plus逆向code generator pgsql实践

mybatis-plus逆向code generator pgsql实践 环境准备重要工具的版本供参考pom依赖待逆向的SQL 配置文件CodeGenerator配置类配置类说明 环境准备 重要工具的版本 jdk1.8.0_131springboot 2.7.6mybatis-plus 3.5.7pgsql 14.15 供参考pom依赖 <?xml version"1.0&quo…

【IoTDB 线上小课 11】为什么 DeepSeek 要选择开源?

新年新气象&#xff0c;【IoTDB 视频小课】第十一期全新来临&#xff01; 关于 IoTDB&#xff0c;关于物联网&#xff0c;关于时序数据库&#xff0c;关于开源... 一个问题重点&#xff0c;3-5 分钟&#xff0c;我们讲给你听&#xff1a; 开源“加成”再次展现&#xff01; 现在…

Java面试宝典:说下Spring Bean的生命周期?

Java面试宝典专栏范围&#xff1a;JAVA基础&#xff0c;面向对象编程&#xff08;OOP&#xff09;&#xff0c;异常处理&#xff0c;集合框架&#xff0c;Java I/O&#xff0c;多线程编程&#xff0c;设计模式&#xff0c;网络编程&#xff0c;框架和工具等全方位面试题详解 每…

web自动化-浏览器驱动下载

web-UI自动化最终要的一步就是下载安装浏览器驱动&#xff0c;下面是常用浏览器驱动的下载安装地址&#xff0c;以及安装之后如何验证的方法&#xff1a; 一、查看浏览器版本号 通过selenium进行自动化测试过程中&#xff0c;浏览器驱动的版本必须要和浏览器的版本保持一致&am…

PDF另存为图片的一个方法

说明 有时需要把PDF的每一页另存为图片。用Devexpress可以很方便的完成这个功能。 窗体上放置一个PdfViewer。 然后循环每一页 for (int i 1; i < pdfViewer1.PageCount; i) 调用 chg_pdf_to_bmp函数获得图片并保存 chg_pdf_to_bmp中调用了PdfViewer的CreateBitmap函数…

easyexcel快速使用

1.easyexcel EasyExcel是一个基于ava的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel 即通过java完成对excel的读写操作&#xff0c; 上传下载 2.easyexcel写操作 把java类中的对象写入到excel表格中 步骤 1.引入依赖 <depen…

opencv中minAreaRect函数输出角度问题

opencv中minAreaRect函数输出角度问题 新版opencv中minAreaRect函数计算最小外接矩形时&#xff0c;角度范围由旧版的[-90, 0]变为[0, 90]。 cv2.minAreaRect输入&#xff1a;四边形的四个点&#xff08;不要求顺序&#xff09;。 输出&#xff1a;最小外接矩形的中心点坐标x…

Python Pandas(7):Pandas 数据清洗

数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况&#xff0c;如果要使数据分析更加准确&#xff0c;就需要对这些没有用的数据进行处理。数据清洗与预处理的常见步骤&#xff1a; 缺失值处理&#xff1a;识别并…

UIView 与 CALayer 的联系和区别

今天说一下UIView 与 CALayer 一、UIView 和 CALayer 的关系 在 iOS 开发中&#xff0c;UIView 是用户界面的基础&#xff0c;它负责处理用户交互和绘制内容&#xff0c;而 CALayer 是 UIView 内部用于显示内容的核心图层&#xff08;Layer&#xff09;。每个 UIView 内部都有…