索引基础
索引是 Elasticsearch 中的基本存储单元,也是您与数据进行交互的层面。您可以并排存储许多独立的数据集。
要存储文档,请将其添加到特定索引中。要进行搜索,请定位一个或多个索引。Elasticsearch 会搜索其中的所有数据并返回任何匹配的文档。您可以通过索引名称、指向一个或多个索引的别名,或者将请求路由到适当支撑索引的数据流来定位您的数据。
在后台,Elasticsearch 将每个索引划分为分片,并将其分布在集群中的各个节点上。将主分片水平扩展为跨其他节点的副本分片,使您的索引能够高效处理大量流量。副本分片提供容错能力,即使单个节点响应失败,也能保持您的数据可用。
本页面介绍了索引的核心部分(文档、映射和设置),描述了 Elasticsearch 如何使用分片物理存储索引数据,并强调了常见的设计决策。
索引由以下组件组成
- 文档:保存数据的 JSON 对象,包括
_index和_id等系统管理的元数据字段。 - 映射:指定字段数据类型并控制数据如何被索引和查询的定义。了解字段数据类型有助于编写高效的查询并避免索引问题。
- 设置:控制存储和性能行为的索引级配置,例如分片数量、副本数量和刷新间隔。
Elasticsearch 以 JSON 文档的形式序列化和存储数据。文档是一组字段,即包含您数据的键值对。每个文档都有一个唯一 ID,您可以明确指定或让 Elasticsearch 自动生成。已索引的文档既包含您定义的文档字段,也包含系统管理的元数据。
一个简单的 Elasticsearch 文档可能如下所示
{
"_index": "my-first-elasticsearch-index",
"_id": "DyFpo5EBxE8fzbb95DOa",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"email": "john@smith.com",
"first_name": "John",
"last_name": "Smith",
"info": {
"bio": "Eco-warrior and defender of the weak",
"age": 25,
"interests": [
"dolphins",
"whales"
]
},
"join_date": "2024/05/01"
}
}
- 元数据字段是以底划线为前缀的系统管理字段。
_index标识存储文档的索引,_id是该文档在索引中的唯一标识符。 _source字段包含提交的原始文档正文。_source内部的字段是您通过映射控制的字段。您可以显式定义这些映射,或者在摄入数据时让 Elasticsearch 动态为您创建它们。
每个索引都有一个映射,用于定义每个字段的数据类型、字段应如何被索引以及应如何存储。
例如,以下映射定义了一些常见数据类型的字段类型
{
"properties": {
"email": { "type": "keyword" },
"first_name": { "type": "text" },
"age": { "type": "integer" },
"join_date": { "type": "date" }
}
}
每个索引都有控制其存储和性能行为的设置。设置在创建索引时配置,可以直接在创建索引请求中配置,也可以通过索引模板配置。某些索引设置可以在实时索引上动态更新。
常见设置包括
index.number_of_shards:主分片的数量。在创建时固定。index.number_of_replicas:每个主分片的副本数量。可以随时更改。index.refresh_interval:新数据变为可搜索的频率。默认值为1s。
有关可用设置的完整列表,请参阅索引设置。
创建索引时,Elasticsearch 不会将所有文档存储在单个位置。相反,它将索引划分为一个或多个分片,并将这些分片分布在集群中的各个节点上。每个分片都是一个自包含的 Apache Lucene 索引,对于它能有效管理的数据量有实际限制,因此将数据拆分到多个分片中可保持单个分片的性能。将这些分片分布在集群节点上增加了水平扩展性和冗余。分片的最佳数量取决于您的数据量、查询模式和集群拓扑结构——没有唯一的正确答案。有关更多信息和最佳实践,请参阅分片大小调整和分发建议。
您在索引或搜索时不会直接与分片交互。相反,您通过名称定位索引,Elasticsearch 会将操作路由到适当的分片。但是,您配置的分片数量和大小会影响性能和稳定性。有关更多信息,请参阅常见索引设计决策。
分片保存了索引文档的一个子集,可以独立处理索引和搜索操作。在每个分片内部,数据被组织成不可变的段,随着文档被索引而写入。要了解段如何影响搜索可用性,请参阅近实时搜索。
分片有两种类型
- 主分片:每个文档恰好属于一个主分片。主分片的数量在索引创建时固定,可以通过索引模板或创建索引请求中的
index.number_of_shards设置来确定。 - 副本分片:主分片的副本,提供冗余并处理读取请求。您可以随时使用
index.number_of_replicas设置调整副本数量。
通过将分片分布在多个节点上,Elasticsearch 可以进行水平扩展,即使在个别节点发生故障时也能继续运行。有关此分布式模型的详细解释,请参阅分布式架构。要了解 Elasticsearch 如何协调主分片和副本分片之间的读取和写入,请参阅读取和写入文档。
设置 Elasticsearch 索引需要围绕索引组件做出一些设计决策:映射控制如何为不同的数据类型创建索引字段,模板标准化跨索引的设置配置,别名将查询与索引名称解耦,生命周期策略自动化数据的长期存储方式。
在处理索引时,您通常需要关注以下决策:
- 命名和别名:为索引和别名使用清晰的命名模式,以简化查询目标并以最小的干扰支持索引更改。
- 映射策略:在探索数据时使用动态映射以提高速度,在生产用例中使用显式映射。预先选择正确的字段类型非常重要,因为它控制着可用的查询和聚合,并且以后更改字段类型需要重新索引。
- 索引或数据流:在需要频繁更新或删除时使用常规索引。对于日志、事件和指标等仅追加的时间序列数据,请改用数据流,因为数据流会自动管理滚动索引。
- 分片大小调整:对于生产工作负载,分片的数量和大小会影响查询速度和集群稳定性。有关指南,请参阅调整分片大小。
- 数据生命周期:决定保留数据多长时间、何时将其移动到更便宜的存储层以及何时删除它。有关更多信息,请参阅数据生命周期。
既然您了解了索引基础知识,请浏览以下页面进行实践操作
- 在 Kibana 中管理索引:在 Kibana 中查看、调查并对索引、数据流和丰富策略执行操作。
- 模板:创建和管理索引模板和组件模板。
- 在 Kibana 中管理数据流:创建、监控和管理数据流及其支撑索引。
- 数据丰富:设置丰富策略以将现有索引中的数据添加到传入的文档中。
- 使用 API 管理数据:使用 Elasticsearch REST API 索引、更新、检索、搜索和删除文档。