在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中检索数据,包括使用各种查询语法和过滤条件来精准定位所需信息。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部