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 数据。
三、文档的操作
-
索引文档
- 使用 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." }
- 如果指定文档 ID,使用 PUT 请求:
- 使用 POST 或 PUT 请求向索引中添加文档。
-
查询文档
- 使用 GET 请求根据文档 ID 查询文档:
GET /my_index/_doc/1
- 使用查询 DSL 搜索文档:
GET /my_index/_search { "query": { "match": { "title": "Elasticsearch" } } }
- 使用 GET 请求根据文档 ID 查询文档:
-
更新文档
- 使用 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." }
- 部分更新:
- 使用 POST 或 PUT 请求更新文档:
-
删除文档
- 使用 DELETE 请求删除文档:
DELETE /my_index/_doc/1
- 使用 DELETE 请求删除文档:
-
批量操作
- 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 提供了批量 API,可以一次性执行多个索引、更新、删除操作。
四、文档的版本控制
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." }
五、文档的存储和检索
- _source 字段
- _source 字段存储文档的原始 JSON 数据。
- 在查询文档时,默认会返回 _source 字段。
- 可以通过设置 _source 参数来控制返回的字段:
GET /my_index/_doc/1?_source=title,date
- 存储字段(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 的主要目标是优化存储和查询性能,同时降低存储成本。
- ILM 的主要阶段
ILM 将索引的生命周期分为四个主要阶段:- Hot(热阶段):索引处于活跃状态,频繁写入和查询。通常使用高性能的硬件来支持高吞吐量和低延迟。
- Warm(温阶段):索引不再频繁写入,但仍需要支持查询。通常使用较低性能的硬件来降低成本。
- Cold(冷阶段):索引很少被查询,主要用于归档。通常使用低成本存储介质。
- Delete(删除阶段):索引不再需要,可以安全删除。
- 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": {} } } } } }
- 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)
快照和恢复功能允许用户创建索引的快照,并将其存储在远程仓库中。快照可以用于备份和恢复数据,以及在灾难恢复时使用。
- 创建快照仓库
首先需要创建一个快照仓库,用于存储快照。PUT _snapshot/my_backup { "type": "fs", "settings": { "location": "/mnt/backups/my_backup" } }
- 创建快照
可以使用以下命令创建索引的快照。PUT _snapshot/my_backup/snapshot_1 { "indices": "my_index-*", "ignore_unavailable": true, "include_global_state": false }
- 恢复快照
可以使用以下命令从快照中恢复索引。POST _snapshot/my_backup/snapshot_1/_restore { "indices": "my_index-*", "ignore_unavailable": true, "include_global_state": false }
8.3 数据保留策略
数据保留策略是指根据业务需求和数据重要性,确定数据的存储期限和删除时间。Elasticsearch 提供了多种方式来实现数据保留策略,包括使用 ILM 的删除阶段、定时任务(Curator)等。
- 使用 ILM 删除阶段
在 ILM 策略中,可以配置删除阶段来自动删除旧索引。"delete": { "min_age": "90d", "actions": { "delete": {} } }
- 使用 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 ```