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

在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/web/37502.shtml

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

相关文章

PyTorch之nn.Module与nn.functional用法区别

文章目录 1. nn.Module2. nn.functional2.1 基本用法2.2 常用函数 3. nn.Module 与 nn.functional3.1 主要区别3.2 具体样例:nn.ReLU() 与 F.relu() 参考资料 1. nn.Module 在PyTorch中,nn.Module 类扮演着核心角色,它是构建任何自定义神经网…

【Spring Boot 源码学习】初识 ConfigurableEnvironment

《Spring Boot 源码学习系列》 初识 ConfigurableEnvironment 一、引言二、主要内容2.1 Environment2.1.1 配置文件(profiles)2.1.2 属性(properties) 2.2 ConfigurablePropertyResolver2.2.1 属性类型转换配置2.2.2 占位符配置2.…

wxss和css有什么区别?

WXSS(WeiXin Style Sheets)和CSS(Cascading Style Sheets)在功能和应用上有很多相似之处,但针对微信小程序的特殊需求,WXSS对CSS进行了一些扩展和修改。以下是WXSS和CSS之间的主要区别: 尺寸单…

Mybatis实现流程

一&#xff0c;UserDAO 接口定义 首先&#xff0c;定义 UserDAO接口&#xff0c;包含 getList()方法,定义类型为List<User>&#xff1a; package dao;import model.User; import java.util.List;public interface UserDAO {List<User> getList(); }二&#xff0c…

Python--进程基础

创建进程 os.fork() 该方法只能在linux和mac os中使用&#xff0c;因为其主要基于系统的fork来实现。window中没有这个方法。 通过os.fork()方法会创建一个子进程&#xff0c;子进程的程序集为该语句下方的所有语句。 import os​​print("主进程的PID为:" , os.g…

Python pdfkit wkhtmltopdf html转换pdf 黑体字体乱码

wkhtmltopdf 黑体在html转换pdf时&#xff0c;黑体乱码&#xff0c;分析可能wkhtmltopdf对黑体字体不太兼容&#xff1b; 1.html内容如下 <html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> </head&…

DreamView数据流

DreamView数据流 查看DV中界面启动dag&#xff0c;/apollo/modules/dreamview_plus/conf/hmi_modes/pnc.pb.txt可以看到点击界面的planning按钮&#xff0c;后台其实启动的是/apollo/modules/planning/planning_component/dag/planning.dag和/apollo/modules/external_command…

语音识别应用Python示例

语音识别是将语音信号转换为文本的技术&#xff0c;是人工智能领域的重要研究方向之一。下面是一个基于Python的简单语音识别应用的代码示例。 首先&#xff0c;需要安装Python的语音识别库SpeechRecognition。可以使用以下命令进行安装&#xff1a; pip install SpeechRecog…

版本号比较

版本号比较&#xff1a; 注意&#xff1a; 不可以直接使用字符串比较的方法进行版本号比较。例如 2.29.1 > 2.3.0 是 false 的 版本号比较可以参考以下代码&#xff1a; function compareVersion(v1, v2) {v1 v1.split(.)v2 v2.split(.)const len Math.max(v1.length, …

Oracle连接mysql

oracle使用的11g&#xff0c;在一台windows服务器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一台windows服务器&#xff0c;这两个服务器之间的网络是互通的。做BI时&#xff0c;要获取不同数据源的数据&#xff0c;这些数据源可能是Oracle&#xff0c;也可能是sqlserv…

springboot基础入门2(profile应用)

Profile应用 一、何为Profile二、profile配置方式1.多profile文件方式2.yml多文档方式 三、加载顺序1. file:./config/: 当前项目下的/config目录下2. file:./ &#xff1a;当前项目的根目录3. classpath:/config/:classpath的/config目录4. classpath:/ : classpath的根目录 四…

【设计模式】【创建型5-2】【工厂方法模式】

文章目录 工厂方法模式工厂方法模式的结构示例产品接口具体产品工厂接口具体工厂客户端代码 实际的使用 工厂方法模式 工厂方法模式的结构 产品&#xff08;Product&#xff09;&#xff1a;定义工厂方法所创建的对象的接口。 具体产品&#xff08;ConcreteProduct&#xff0…

Redis 集群模式

一、集群模式概述 Redis 中哨兵模式虽然提高了系统的可用性&#xff0c;但是真正存储数据的还是主节点和从节点&#xff0c;并且每个节点都存储了全量的数据&#xff0c;此时&#xff0c;如果数据量过大&#xff0c;接近或超出了 主节点 / 从节点机器的物理内存&#xff0c;就…

个人网站制作 Part 28 添加用户活动跟踪功能 | Web开发项目添加页面缓存

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加用户活动跟踪功能&#x1f528;使用分析工具&#x1f527;步骤 1: 选择分析工具&#x1f527;步骤 2: 注册Google Analytics账户&#x1f527;步骤 3: 获取Analytics…

Java面试题--JVM大厂篇之深入了解G1 GC:高并发、响应时间敏感应用的最佳选择

引言&#xff1a; 在现代Java应用的性能优化中&#xff0c;垃圾回收器&#xff08;GC&#xff09;的选择至关重要。对于高并发、响应时间敏感的应用而言&#xff0c;G1 GC&#xff08;Garbage-First Garbage Collector&#xff09;无疑是一个强大的工具。本文将深入探讨G1 GC适…

李一桐遭遇蜈蚣惊魂

李一桐遭遇“蜈蚣惊魂”&#xff01;刘宇宁展现真男人本色在娱乐圈的幕后&#xff0c;总有一些心跳加速的惊险。近日&#xff0c;李一桐在拍戏时遭遇了一场“蜈蚣惊魂”&#xff0c;让无数粉丝和网友为她捏了一把冷汗。而在这场惊险的遭遇中&#xff0c;刘宇宁展现出了真男人的…

NOI大纲——普及组——二叉搜索树

二叉搜索树 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下几个特点&#xff1a; 节点的左子树上的所有节点的值都小于或等于该节点的值。节点的右子树上的所有节点的值都大于或等于该节点的值。每个节点…

ActiveMq工具之管理页面说明

文章目录 安装ActiveMQ一: 访问管理页面二: 进入管理页面&#xff0c;主页三: Queues页说明四: Topics页说明五: Subscribers页说明 安装ActiveMQ wget https://archive.apache.org/dist//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz wget https://mirrors.huaweiclou…

为什么越来越多的企业选择外包?赋能企业未来

软件开发过程包括设计需求、设计方案、产品研发、产品交付、后期维护&#xff0c;许多企业并沒有软件开发的专业能力与工作经验&#xff0c;将软件开发工作进行外包是比较节约成本的&#xff0c;企业能少走不少弯路。 YesPMP平台&#xff08;一站式软件外包、项目外包服务-YesP…

UWA Pipeline 2.6.1版本更新

UWA Pipeline是专为游戏开发团队设计的本地协作平台&#xff0c;旨在帮助团队建立专业的DevOps研发交付流水线。本平台提供了可视化的CI/CD操作界面&#xff0c;高可用的自动化测试和无缝集成的UWA性能保障服务等核心功能。 在最新的Pipeline更新中&#xff0c;UWA引入了参数配…