加载中

索引基础

索引是 Elasticsearch 中的基本存储单元,也是您与数据进行交互的层面。您可以并排存储许多独立的数据集。

要存储文档,请将其添加到特定索引中。要进行搜索,请定位一个或多个索引。Elasticsearch 会搜索其中的所有数据并返回任何匹配的文档。您可以通过索引名称、指向一个或多个索引的别名,或者将请求路由到适当支撑索引的数据流来定位您的数据。

在后台,Elasticsearch 将每个索引划分为分片,并将其分布在集群中的各个节点上。将分片水平扩展为跨其他节点的副本分片,使您的索引能够高效处理大量流量。副本分片提供容错能力,即使单个节点响应失败,也能保持您的数据可用。

本页面介绍了索引的核心部分(文档映射设置),描述了 Elasticsearch 如何使用分片物理存储索引数据,并强调了常见的设计决策。

Elastic Cloud 无服务器版中的索引

在 Elastic Cloud 无服务器版中

  • 分片、副本和节点完全由平台为您管理。平台会根据您的工作负载自动扩展资源,因此您无需配置或监控这些细节。本页面关于分片的内容旨在解释 Elasticsearch 的底层工作原理。
  • 每个项目最多支持 15,000 个索引。此限制有助于确保可靠的性能和稳定性。如果需要更高的限制,您可以请求增加配额。有关索引大小的建议,请参阅索引大小调整指南

索引由以下组件组成

  • 文档:保存数据的 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"
  }
}
		
  1. 元数据字段是以底划线为前缀的系统管理字段。_index 标识存储文档的索引,_id 是该文档在索引中的唯一标识符。
  2. _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 索引需要围绕索引组件做出一些设计决策:映射控制如何为不同的数据类型创建索引字段,模板标准化跨索引的设置配置,别名将查询与索引名称解耦,生命周期策略自动化数据的长期存储方式。

在处理索引时,您通常需要关注以下决策:

  • 命名和别名:为索引和别名使用清晰的命名模式,以简化查询目标并以最小的干扰支持索引更改。
  • 映射策略:在探索数据时使用动态映射以提高速度,在生产用例中使用显式映射。预先选择正确的字段类型非常重要,因为它控制着可用的查询和聚合,并且以后更改字段类型需要重新索引
  • 索引或数据流:在需要频繁更新或删除时使用常规索引。对于日志、事件和指标等仅追加的时间序列数据,请改用数据流,因为数据流会自动管理滚动索引。
  • 分片大小调整:对于生产工作负载,分片的数量和大小会影响查询速度和集群稳定性。有关指南,请参阅调整分片大小
  • 数据生命周期:决定保留数据多长时间、何时将其移动到更便宜的存储层以及何时删除它。有关更多信息,请参阅数据生命周期

既然您了解了索引基础知识,请浏览以下页面进行实践操作

© . This website operates independently and is not affiliated with or endorsed by Elasticsearch B.V. All brand names, logos, and trademarks are the property of their respective owners.