【基础篇】第3章 Elasticsearch 索引与文档操作

在Elasticsearch的世界里,索引是存储数据的地方,文档则是索引中的基本单位,包含具体的数据信息。本章将深入探讨索引和文档操作的基础,从创建到管理,为高效数据处理奠定基础。

3.1 索引概念与创建

3.1.1 索引、类型与文档简介

  • 索引:类似于传统数据库中的数据库,用于存储具有相似特征的数据集合。每个索引都有唯一的名称,并且可以被分配到多个分片上。
  • 类型:在Elasticsearch 7.x之后,类型已经被弃用,建议将所有文档存储在单一类型 _doc 下,以简化数据模型。
  • 文档:是索引中的基本单位,相当于数据库中的行记录。文档是以JSON格式存储的数据对象,每个文档都有一个唯一的标识符(_id)。

3.1.2 创建、删除与修改索引

  • 创建索引
    通过发送一个PUT请求到http://localhost:9200/{index_name},可以创建一个新的索引。例如,创建名为my_index的索引:

    curl -X PUT "localhost:9200/my_index?pretty"
    
  • 删除索引
    使用DELETE请求到相应索引的URL即可删除索引,如:

    curl -X DELETE "localhost:9200/my_index?pretty"
    
  • 修改索引
    修改索引通常涉及更新索引的设置或映射。使用PUT请求加上特定的API,如更新索引设置:

    curl -X PUT "localhost:9200/my_index/_settings?pretty" -H 'Content-Type: application/json' -d'
    {"index": {"number_of_replicas": 2}
    }'
    

3.2 文档 CRUD

3.2.1 创建文档

通过POST或PUT方法添加文档至索引中。例如,向my_index索引添加一个文档:

curl -X POST "localhost:9200/my_index/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{"title": "Elasticsearch入门","author": "张三","content": "这是关于Elasticsearch的第一篇文章。"
}'

3.2.2 读取文档

GET请求可以用来获取指定ID的文档:

curl -X GET "localhost:9200/my_index/_doc/1?pretty"

3.2.3 更新文档

文档更新实际上是对原文档的替换操作。可以通过POST或PUT请求实现,使用版本控制确保并发安全:

curl -X POST "localhost:9200/my_index/_doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{"doc": {"content": "这是更新后的内容,加入了新的信息。"}
}'

3.2.4 删除文档

DELETE请求可以删除指定ID的文档:

curl -X DELETE "localhost:9200/my_index/_doc/1?pretty"

3.2.5 批量操作

批量操作是Elasticsearch中一项重要的性能优化手段,它允许你在一个请求中执行多个索引、更新、删除操作,显著提高了处理大量数据时的效率。本节将深入探讨批量操作的细节,包括批量操作的格式、优势、最佳实践以及如何有效利用批量API进行高效的数据处理:

curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/x-ndjson' -d'
{ "index" : { "_index" : "my_index", "_id" : "2" } }
{ "title" : "深入Elasticsearch", "author" : "李四", "content" : "探索Elasticsearch的高级特性。" }
{ "delete" : { "_index" : "my_index", "_id" : "1" } }
'
批量操作格式

批量操作使用_bulk API,接受一种特殊的NDJSON(Newline Delimited JSON)格式输入,其中每个操作由两行组成:一行是操作元数据,另一行是实际的数据文档。操作元数据包括操作类型(如indexcreateupdatedelete)和可选的元数据,如_id和_version。

示例:

{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_id" : "2" } }
{ "field1" : "value2" }
{ "delete" : { "_index" : "test", "_id" : "3" } }
批量操作的优势
  1. 减少网络开销:相较于单个操作,批量处理减少了客户端与服务器之间的往返次数,显著提升了处理速度。
  2. 提升吞吐量:Elasticsearch能够并行处理批量中的多个请求,特别是在处理大量小文档时,效率提升尤为明显。
  3. 原子性:尽管批量操作是一系列操作的组合,但Elasticsearch保证了批量内的所有操作要么全部成功,要么全部失败,提供了事务性的保障。
  4. 灵活的数据导入:适用于数据迁移、日志收集、定时任务等场景,能够高效地导入大量数据。
最佳实践
  1. 平衡批量大小:批量大小不是越大越好。过大的批量会消耗更多的内存和CPU资源,增加处理时间,甚至导致节点响应缓慢或失败。推荐根据实际应用和硬件性能进行测试,找到最优的批量大小。
  2. 监控与调整:使用Elasticsearch的监控工具(如_cat APIs、Kibana的监控面板)跟踪批量操作的性能,如响应时间和错误率,根据反馈调整策略。
  3. 错误处理:批量操作响应中包含了每个操作的执行状态,包括成功或失败的具体原因。应用层应解析这些信息,对失败操作进行重试或记录。
  4. 索引刷新策略:批量导入大量数据时,可以通过设置refresh_interval-1暂停索引的自动刷新,待导入完毕后再手动刷新,以进一步提升导入速度。
批量操作的高级用法
  • 脚本更新:在批量更新操作中,可以直接嵌入Painless脚本,实现复杂的业务逻辑处理,无需单独查询再更新。
  • 版本控制:批量操作支持乐观锁并发控制,通过指定文档的_version字段,可以防止并发更新导致的数据不一致。
  • 回执处理:使用refresh参数可以在批量操作后立即刷新索引,使得新数据立即可见;使用wait_for_active_shards确保操作在指定数量的分片活跃时才执行,增强数据安全性。

3.3 映射管理

映射管理是Elasticsearch数据建模的关键环节,它直接影响到数据的存储效率、查询性能及结果准确性。本节将深入解析映射的概念、动态与静态映射的配置方法,以及如何有效地管理与更新映射,以适应数据模型的变化。

3.3.1 映射概述

映射(Mapping)是Elasticsearch中定义索引如何存储文档的一种方式,它描述了文档中每个字段的数据类型、分析器设置、是否存储原始值等属性。映射不仅决定了如何解析和索引字段,也影响着查询性能和结果排序。

3.3.2 动态映射

自动识别与创建

Elasticsearch默认启用动态映射,这意味着当你首次索引一个文档时,如果文档中的字段没有在映射中预先定义,Elasticsearch会自动检测字段类型并创建相应的映射。这一特性极大地简化了初始数据导入的过程,但也可能导致映射过于灵活,缺乏统一性。

动态映射控制

尽管动态映射方便,但有时需要限制其行为以保持数据的一致性和优化存储。通过设置dynamic参数为truefalsestrict,可以分别允许自动映射、禁止任何自动映射,或仅允许已知字段的映射自动更新。

3.3.3 静态映射

手动定义

静态映射是指在创建索引之前或之后明确地定义好所有字段的映射规则。这包括指定字段的数据类型(如textinteger)、是否分析(analyzed或not_analyzed)、是否存储原始值(store)等。

curl -X PUT "localhost:9200/my_index/_mapping?pretty" -H 'Content-Type: application/json' -d'
{"properties": {"title": { "type": "text" },"author": { "type": "keyword" }}
}'

优势与局限

静态映射的优势在于提供了对数据模型的严格控制,有助于保持数据一致性,减少存储空间的浪费,并优化查询性能。然而,它要求在索引初期就对数据结构有较深的理解,且在数据模式发生变化时,需要手动调整映射,增加了维护成本。

3.3.4 映射更新策略

渐进式映射

Elasticsearch支持渐进式的映射更新,允许在索引生命周期中添加新字段或改变字段的某些属性,如分析器设置。但是,核心字段类型(如从text改为integer)的变更通常不被支持,因为这可能导致数据丢失或索引不一致。

更新方法

映射更新通常通过PUT请求到索引的_mapping API来完成。例如,为my_index索引添加一个新的字段映射:

curl -X PUT "localhost:9200/my_index/_mapping" -H 'Content-Type: application/json' -d'
{"properties": {"new_field": { "type": "date" }}
}'

注意事项

  • 更新映射可能引起索引重新打开,对查询性能有短暂影响。
  • 对于大规模生产环境,映射更新应谨慎进行,避免对在线服务造成影响。
  • 使用PUT更新映射时,若已有字段的映射与请求中不一致,可能会导致错误,除非使用ignore_conflicts参数。
3.3.5 映射最佳实践
  • 前期规划:尽可能在索引创建前明确映射,减少后期修改映射的需求。
  • 动态映射控制:根据数据特点,合理设置动态映射的策略,避免不必要的字段自动创建。
  • 定期审查:随着数据模式的演进,定期审查映射,确保其符合当前数据需求,优化存储和查询性能。
  • 备份映射:在进行重大映射更改前,备份当前映射,以便于回滚或参考。

通过细致的映射管理,不仅可以提升Elasticsearch的性能,还能确保数据的准确性和一致性,为复杂的数据查询和分析提供坚实的基础。

小结

本章涵盖了Elasticsearch中索引与文档操作的核心知识点,从基础的索引创建到文档的CRUD操作,再到映射的管理,为数据的存储和检索奠定了基础。掌握了这些基本技能,你将能够有效管理Elasticsearch中的数据。下一章《第4章 查询与过滤》,将深入探讨如何高效地从Elasticsearch中检索数据,包括使用各种查询语法和过滤条件来精准定位所需信息。

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

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

相关文章

理解MySQL核心技术:外键的概念作用和应用实例

引言 在数据库管理系统(DBMS)中,外键(Foreign Key)是维持数据一致性和实现数据完整性的重要工具。本文将详细介绍MySQL外键的基本概念、作用,以及相关的操作指南和应用实例,帮助读者掌握并灵活…

YOLOv8的5种不同部署方式推理速度对比:Pytorch、ONNX、OpenVINO-FP32、OpenVINO-int8、TensorRT

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

FatFs(文件系统)

1官网 FatFs - 通用 FAT 文件系统模块 (elm-chan.org) FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 模块是按照 ANSI C (C89) 编写的,并且与磁盘 I/O 层完全分离。因此,它独立于平台。它可以集成到资源有限…

安全与加密常识(5)自签名证书

文章目录 什么是自签名证书?自签名证书有什么优势?自签名证书有什么缺陷?企业可以使用自签名证书吗?如何创建自签名证书?前面我们介绍了什么是证书签名请求:证书签名请求(Certificate Signing Request,CSR)是一种数据文件,通常由申请者生成,并用于向证书颁发机构(C…

webpack打包配置

基于webpack5.x 一、缓存设置 // 内存缓存: 速度快,配置简单,但占用内存且重启后失效 cache: {type: memory, }// 磁盘缓存 (filesystem):持久性好,适合大型项目,但速度较慢,配置相对复杂。 cache: {type:…

华为智能驾驶方案剖析

华为ADS智驾方案始终坚持激光雷达毫米波雷达摄像头的多传感器融合路线,行业降本压力下硬件配置从超配逐步转向贴合实际需求,带动整体硬件成本下降。 1)单车传感器数量呈现下降趋势,包括激光雷达从3个减配至1个、毫米波雷达从6R减配至3R、摄像…

【深度学习】GPU版本

我发现nvidia-smi的cuda版本不是我期望镜像中的版本,咨询一下还要选择对应的驱动,比如cuda12.2对应的 {"12.3": "525.60","12.2": "525.60","12.1": "525.60","12.0": "52…

【硬件开发】安规电容X电容和Y电容

为什么有安规电容 国家为了保护人民的安全要求,电容器失效后,不会导致电击,不危及人身安全的安全电容器 安规电容的作用 滤除雷电冲击波,以及插拔插座的高频噪声 X电容 聚酯电容 位置 X电容位于火线和零线之间 作用 滤除…

Swift 中更现代化的调试日志系统趣谈(二)

概述 在上篇 Swift 中更现代化的调试日志系统趣谈(一) 博文中,我们初步讨论了如何利用 Swift OSLog 框架中的 Logger 日志记录器替代“简陋”的 print 方法来记录我们的调试消息。 而接下来我们会再接再厉,继续调试日志系统的进一步介绍。 在本篇博文中,您将学到如下内容…

No module named ‘pytesseract‘

报错解释: 这个错误表示Python无法找到名为pytesseract的模块。pytesseract是一个用于OCR(光学字符识别)的库,它依赖于Google的Tesseract-OCR引擎。这个错误通常发生在尝试使用pytesseract之前未正确安装该模块的情况下。 解决方…

timm中模型更换huggingface模型链接

现在timm默认使用huggingface的链接了,错误链接如下: (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /timm/swinv2_tiny_window8_256.ms_in1k/resolve/main/model.safetensors (Caused by C…

MySQL:表的内连接和外连接、索引

文章目录 1.内连接2.外连接2.1 左外连接2.2 右外连接 3.综合练习4.索引4.1见一见索引4.2 硬件理解4.3 MySQL 与磁盘交互基本单位(软件理解)4.4 (MySQL选择的数据结构)索引的理解4.5 聚簇索引 VS 非聚簇索引 5.索引操作5.1 创建索引5.2 查询索引5.3 删除索引 1.内连接 内连接实…

Keepalive技术

文章目录 一、Keepalive基础vrrp技术Keepalived介绍Keepalived架构 二、 Keepalived 相关文件配置文件组成全局配置虚拟路由器配置 三、配置lvs和keepalive联动服务器架构抢占模式配置配置单播、组播配置通知模块日志功能脑裂现象 四、keepalived和nginx联动keepalive和其他应用…

OSINT技术情报精选·2024年6月第4周

OSINT技术情报精选2024年6月第4周 2024.6.30版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1、大数据技术标准推进委员会:《面向人工智能的数据治理(DG4AI)实践指南1.0》 2024年6月19-20日,“来这里,…

嵌入式Linux系统编程 — 5.5 sleep、usleep和nanosleep系统休眠函数

目录 1 为什么需要休眠 2 sleep、usleep和nanosleep函数 2.1 sleep函数 2.2 usleep函数 2.3 nanosleep函数 3 示例程序 1 为什么需要休眠 有时需要将进程暂停或休眠一段时间, 进入休眠状态之后,程序将暂停运行,直到休眠结束。 以下是一…

Is ChatGPT a Good Personality Recognizer? A Preliminary Study?

ChatGPT是一个很好的人格识别者吗?初步调研 摘要1 介绍2 背景和相关工作3 实验3.1 数据集3.2 提示策略3.3 基线3.4 评估指标3.5 实现细节3.6 Overall Performance (RQ1)3.7 ChatGPT在人格识别上的公平性 (RQ2)3.8 ChatGPT对下游任务的人格识别能力(RQ3&a…

javaEE——Servlet

1.web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互 2.java后端开发环境搭建 web后端(javaEE)程序需要运行在服务器中的,这样前端才可以访问得到 3.服务器是什么? ①服务器就是一款软件,可以向其发送请求&#…

如何根据两个关键字查询报错日志的位置

要根据两个关键字查询报错日志的位置,在Linux中,你可以使用grep命令结合正则表达式(regex)来实现。grep命令允许你在文件中搜索匹配特定模式的行。 假设你有两个关键字“keyword1”和“keyword2”,并且你想找到同时包…

教学常用内容

容器 #include<bits/stdc.h> #define fi first #define se second #define pb push_back #define PII pair<int,int > #define int long long #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);using namespace std;const int N 1e610;vec…

深入解析HDFS:定义、架构、原理、应用场景及常用命令

引言 Hadoop分布式文件系统&#xff08;HDFS&#xff0c;Hadoop Distributed File System&#xff09;是Hadoop框架的核心组件之一&#xff0c;它提供了高可靠性、高可用性和高吞吐量的大规模数据存储和管理能力。本文将从HDFS的定义、架构、工作原理、应用场景以及常用…