当前位置: 首页 > article >正文

Elasticsearch 文档

一、文档的基本概念

  • 文档是什么?
    • 文档是 Elasticsearch 中存储数据的基本单元,格式为 JSON。
    • 每个文档包含多个字段(Field),字段可以是各种数据类型,如文本、数字、日期等。
    • 文档存储在索引中,索引是文档的集合。
  • 文档的唯一标识
    • 每个文档都有一个唯一的文档 ID,用于标识该文档。
    • 文档 ID 可以由用户指定,也可以由 Elasticsearch 自动生成。
  • 文档的结构
    • 文档是一个 JSON 对象,包含多个键值对(Key-Value Pairs)。
    • 示例:
      {
        "_index": "my_index",
        "_type": "_doc",
        "_id": "1",
        "_version": 1,
        "_score": 1.0,
        "_source": {
          "title": "Elasticsearch Guide",
          "author": "John Doe",
          "published_date": "2023-10-01",
          "content": "Elasticsearch is a distributed, RESTful search and analytics engine."
        }
      }
      

二、文档的组成部分

  • 字段(Field)
    • 字段是文档中的基本数据单元,类似于关系型数据库中的“列”。
    • 每个字段有一个名称和一个值,值可以是各种数据类型。
    • 常见的字段类型:
      • text:全文搜索字段,支持分词。
      • keyword:精确匹配字段,不支持分词。
      • date:日期字段。
      • long, integer, short, byte, double, float:数值类型字段。
      • boolean:布尔类型字段。
      • object:嵌套对象字段。
      • nested:嵌套类型字段(用于数组中的对象)。
  • 元数据字段(Metadata Fields)
    • Elasticsearch 为每个文档自动添加一些元数据字段,用于管理文档。
    • 常见的元数据字段:
      • _index:文档所属的索引名称。
      • _type:文档的类型(在 Elasticsearch 7.x 及以后版本中,默认为 _doc)。
      • _id:文档的唯一标识符。
      • _version:文档的版本号,用于乐观并发控制。
      • _source:文档的原始 JSON 数据。

三、文档的操作

  1. 索引文档

    • 使用 POST 或 PUT 请求向索引中添加文档。
      • 如果指定文档 ID,使用 PUT 请求:
        PUT /my_index/_doc/1
        {
          "title": "Elasticsearch Guide",
          "author": "John Doe",
          "published_date": "2023-10-01",
          "content": "Elasticsearch is a distributed, RESTful search and analytics engine."
        }
        
      • 如果不指定文档 ID,使用 POST 请求,Elasticsearch 会自动生成文档 ID:
        POST /my_index/_doc/
        {
        	  "title": "Elasticsearch Guide",
          "author": "John Doe",
          "published_date": "2023-10-01",
          "content": "Elasticsearch is a distributed, RESTful search and analytics engine."
        }
        
  2. 查询文档

    • 使用 GET 请求根据文档 ID 查询文档:
      GET /my_index/_doc/1
      
    • 使用查询 DSL 搜索文档:
      GET /my_index/_search
      {
        "query": {
          "match": {
      	"title": "Elasticsearch"
      	}
        }
      }
      
  3. 更新文档

    • 使用 POST 或 PUT 请求更新文档:
      • 部分更新:
        部分更新使用POST,只会修改对应字段的值。
        POST /my_index/_update/1
        {
          "doc": {
            "content": "Elasticsearch is a powerful search and analytics engine."
          }
        }
        
      • 全量更新:
        全量更新使用PUT,会先删除旧文档,再添加新文档。如果旧文档不存在,则直接添加新文档。
        PUT /my_index/_doc/1
        {
          "title": "Elasticsearch Guide",
          "author": "John Doe",
        	  "published_date": "2023-10-01",
        	  "content": "Elasticsearch is a powerful search and analytics engine."
        }
        
  4. 删除文档

    • 使用 DELETE 请求删除文档:
      DELETE /my_index/_doc/1
      
  5. 批量操作

    • Elasticsearch 提供了批量 API,可以一次性执行多个索引、更新、删除操作。
      POST /_bulk
      { "index" : { "_index" : "my_index", "_id" : "1" } }
      { "title": "Elasticsearch Guide", "author": "John Doe" }
      { "delete" : { "_index" : "my_index", "_id" : "2" } }
      { "update" : { "_index" : "my_index", "_id" : "3" } }
      { "doc" : { "content": "Updated content" } }
      

四、文档的版本控制

Elasticsearch 使用版本号(_version)来实现乐观并发控制。每次更新文档时,版本号会自动递增。可以通过指定版本号来确保更新操作的安全性。

  • 版本号(_version)
    • 每个文档都有一个版本号,用于乐观并发控制。
    • 当文档被更新时,版本号会自动递增。
    • 可以通过指定版本号来确保文档的更新操作是基于最新版本。
  • 乐观并发控制
    • 在更新文档时,可以指定版本号以确保操作的原子性。
    • 示例:
      PUT /my_index/_doc/1?version=2
      {
        "title": "Elasticsearch Guide",
        "author": "John Doe",
        "published_date": "2023-10-01",
        "content": "Updated content with version control."
      }
      

五、文档的存储和检索

  1. _source 字段
    • _source 字段存储文档的原始 JSON 数据。
    • 在查询文档时,默认会返回 _source 字段。
    • 可以通过设置 _source 参数来控制返回的字段:
    GET /my_index/_doc/1?_source=title,date
    
  2. 存储字段(Stored Fields)
    • 除了 _source 字段,Elasticsearch 还可以将某些字段单独存储,以便快速检索。
    • 在映射中定义字段时,可以设置 store 参数:
      "mappings": {
      "properties": {
      	"title": {
      	"type": "text",
      	"store": true
      	}
        }
      }
      

六、文档的动态映射

  • Elasticsearch 支持动态映射,即在索引文档时自动推断字段类型。
  • 可以通过设置 dynamic 参数来控制动态映射的行为:
    • true:自动添加新字段(默认)。
    • false:忽略新字段。
    • strict:遇到未定义的字段时抛出异常。
  • 示例:
    "mappings": {
      "dynamic": "strict",
      "properties": {
        "title": { "type": "text" }
      }
    }
    

七、文档的路由

在分布式环境中,Elasticsearch 使用路由(Routing)来确定文档存储在哪个分片上。默认情况下,路由值等于文档 ID,但可以自定义路由值以优化查询性能。

PUT /my_index/_doc/1?routing=user123
{
  "title": "Elasticsearch Guide",
  "author": "John Doe",
  "published_date": "2023-10-01",
  "content": "This document is routed using a custom value."
}

八、文档的生命周期管理

Elasticsearch 中的文档生命周期管理(Document Lifecycle Management)是指对文档从创建到删除的整个生命周期进行管理和优化的过程。随着数据量的增长和业务需求的变化,文档的生命周期管理变得尤为重要。Elasticsearch 提供了多种工具和功能来帮助用户有效地管理文档的生命周期,包括索引生命周期管理(ILM)、快照和恢复、以及数据保留策略等。

8.1 索引生命周期管理(Index Lifecycle Management, ILM)

索引生命周期管理(ILM)是 Elasticsearch 提供的一种自动化管理索引生命周期的功能。ILM 允许用户定义索引在不同阶段(如热、温、冷、删除)的策略,并自动执行这些策略。ILM 的主要目标是优化存储和查询性能,同时降低存储成本。

  1. ILM 的主要阶段
    ILM 将索引的生命周期分为四个主要阶段:
    • Hot(热阶段):索引处于活跃状态,频繁写入和查询。通常使用高性能的硬件来支持高吞吐量和低延迟。
    • Warm(温阶段):索引不再频繁写入,但仍需要支持查询。通常使用较低性能的硬件来降低成本。
    • Cold(冷阶段):索引很少被查询,主要用于归档。通常使用低成本存储介质。
    • Delete(删除阶段):索引不再需要,可以安全删除。
  2. ILM 策略配置
    ILM 策略定义了索引在不同阶段的行为和转换条件。用户可以通过 Kibana 或 Elasticsearch API 来创建和管理 ILM 策略。
    • 示例:
    PUT _ilm/policy/my_policy
    {
      "policy": {
        "phases": {
          "hot": {
            "min_age": "0ms",
            "actions": {
              "rollover": {
                "max_size": "50gb",
                "max_age": "30d"
              },
              "set_priority": {
                "priority": 100
              }
            }
          },
          "warm": {
            "min_age": "30d",
            "actions": {
              "forcemerge": {
                "max_num_segments": 1
              },
              "shrink": {
                "number_of_shards": 1
              },
              "allocate": {
                "number_of_replicas": 1
              },
              "set_priority": {
                "priority": 50
              }
            }
          },
          "cold": {
            "min_age": "60d",
            "actions": {
              "allocate": {
                "require": {
                  "data": "cold"
                }
              }
            }
          },
          "delete": {
            "min_age": "90d",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
    
  3. ILM 策略应用
    创建 ILM 策略后,可以将其应用到索引模板或现有索引上。
    • 应用到索引模板:
      PUT _template/my_template
      {
        "index_patterns": ["my_index-*"],
        "settings": {
          "index.lifecycle.name": "my_policy",
          "index.lifecycle.rollover_alias": "my_index"
        }
      }
      
    • 应用到现有索引:
      PUT my_index-000001/_settings
      {
        "index.lifecycle.name": "my_policy",
        "index.lifecycle.rollover_alias": "my_index"
      }
      
8.2 快照和恢复(Snapshot and Restore)

快照和恢复功能允许用户创建索引的快照,并将其存储在远程仓库中。快照可以用于备份和恢复数据,以及在灾难恢复时使用。

  1. 创建快照仓库
    首先需要创建一个快照仓库,用于存储快照。
    PUT _snapshot/my_backup
    {
      "type": "fs",
      "settings": {
        "location": "/mnt/backups/my_backup"
      }
    }
    
  2. 创建快照
    可以使用以下命令创建索引的快照。
    PUT _snapshot/my_backup/snapshot_1
    {
      "indices": "my_index-*",
      "ignore_unavailable": true,
      "include_global_state": false
    }
    
  3. 恢复快照
    可以使用以下命令从快照中恢复索引。
    POST _snapshot/my_backup/snapshot_1/_restore
    {
      "indices": "my_index-*",
      "ignore_unavailable": true,
      "include_global_state": false
    }
    
8.3 数据保留策略

数据保留策略是指根据业务需求和数据重要性,确定数据的存储期限和删除时间。Elasticsearch 提供了多种方式来实现数据保留策略,包括使用 ILM 的删除阶段、定时任务(Curator)等。

  1. 使用 ILM 删除阶段
    在 ILM 策略中,可以配置删除阶段来自动删除旧索引。
    "delete": {
      "min_age": "90d",
      "actions": {
        "delete": {}
      }
    }
    
  2. 使用 Curator
    Elasticsearch Curator 是一个命令行工具,用于管理索引和快照。可以使用 Curator 来定义和执行数据保留策略。
    actions:
      1:
        action: delete_indices
        description: "Delete indices older than 90 days"
        options:
          ignore_empty_list: True
          timeout_override:
          continue_if_exception: False
          disable_action: False
        filters:
        - filtertype: pattern
          kind: prefix
          value: my_index-
        - filtertype: age
          source: creation_date
          direction: older
          unit: days
          unit_count: 90
    	```
    

http://www.kler.cn/a/599220.html

相关文章:

  • Python 正则表达式全攻略:re 库精讲与实战
  • 【python】OpenCV—Hand Detection
  • 内网(域)渗透测试流程和模拟测试day--1--信息收集阶段
  • 具身系列——NLP工程师切入机器人和具身智能方向
  • 如何让机器像人类一样感知声调颤抖与嘴角抽动的同步情感表达?
  • MySQL InnoDB行锁等待时间是怎么引起的?
  • 腾讯云HAI1元体验:DeepSeek-R1模型助力个人博客快速搭建
  • 使用python numpy计算并显示音频数据的频谱信息
  • 内核编程十:进程的虚拟地址空间
  • 机器学习之条件概率
  • 金牛区国际数字影像产业园:文创核心功能深度剖析
  • 【科研工具使用】latex如何插入图片、分段落、插入公式
  • Python实现MySQL数据库对象的血缘分析
  • 智慧路灯杆:点亮未来城市的科技基石
  • 架构思维:通用系统设计方法论_从复杂度分析到技术实现指南
  • mysql入门操作
  • 多线程 --- 进程和线程的基本知识
  • 图解AUTOSAR_SWS_WatchdogInterface
  • Bash语言的物联网
  • python基础之--包和模块