通过 API 命令管理 Elasticsearch 索引的终极指南

掌握 Elasticsearch 索引管理,本终极指南将带您了解 API 命令。学习如何使用 `PUT` 命令创建具有自定义映射和设置的索引,使用 `GET` 命令全面查看其配置和详细信息,并使用 `DELETE` 命令安全删除不必要的索引。本文提供了实际示例、最佳实践和重要警告,使您能够有效地控制 Elasticsearch 中数据的生命周期,以实现最佳性能和资源管理。

38 浏览量

通过 API 命令管理 Elasticsearch 索引的终极指南

Elasticsearch 是一个功能强大的分布式搜索和分析引擎,它将数据组织成 索引。索引本质上是一个逻辑命名空间,指向一个或多个存储文档的物理分片。有效管理这些索引对于维护健康、高性能和可扩展的 Elasticsearch 集群至关重要。本指南将引导您了解索引生命周期管理的基本 API 命令,使您能够自信地创建、检查和删除索引。

高效的索引管理至关重要,原因有以下几点:它允许您定义数据的存储和搜索方式,通过配置分片和副本等设置来优化性能,并通过删除过期或不必要的数据来管理存储空间。掌握这些命令是任何 Elasticsearch 管理员或开发人员的核心技能,可确保您的数据基础设施保持强大和敏捷。

理解 Elasticsearch 索引

在深入了解 API 命令之前,理解 Elasticsearch 索引是什么至关重要。简单来说,索引就像关系数据库系统中的数据库。它是一系列具有相似特征且通常具有共同用途的文档集合。索引中的每个文档都带有一个类型(尽管在较新的 Elasticsearch 版本中,一个索引通常代表一个单一类型,通常是 _doc)和一个唯一 ID。索引由一个或多个 分片 组成,分片是自包含的底层 Lucene 索引。这些分片可以分布在多个节点上,提供可伸缩性和容错能力。

索引的关键组成部分包括:
* 映射(Mappings):定义索引中文档的模式,指定字段名称、数据类型(例如 textkeyworddateinteger)以及它们应如何被索引。
* 设置(Settings):配置各种操作方面,例如主分片数量、副本分片数量、刷新间隔和分析设置。
* 别名(Aliases):可以指向一个或多个索引的虚拟名称,为应用程序在不知道索引实际名称的情况下与索引交互提供了灵活性。

创建 Elasticsearch 索引

创建索引是数据存储到 Elasticsearch 的第一步。您可以创建具有默认设置的索引,或者更常见的是,根据您的数据和搜索要求定义自定义映射和设置。为此,使用 PUT 方法。

基本索引创建

要创建具有默认设置的索引,您只需向所需索引名称发出 PUT 请求。

PUT /my_first_index

成功创建后,Elasticsearch 将返回一个确认:

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "my_first_index"
}

这将默认创建一个带有一个主分片和一个副本分片的索引,并启用动态映射(这意味着 Elasticsearch 将在文档被索引时推断字段类型)。

使用自定义映射和设置创建索引

为了获得更多控制,您可以为字段定义显式映射,并指定索引设置,例如分片和副本的数量。这对于优化搜索性能和确保数据完整性至关重要。

示例:自定义映射和设置

让我们创建一个名为 products 的索引,其中包含用于产品数据的特定字段类型,并将其配置为 3 个主分片和 2 个副本分片。

PUT /products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "properties": {
      "product_id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      },
      "description": {
        "type": "text"
      },
      "price": {
        "type": "float"
      },
      "stock": {
        "type": "integer"
      },
      "created_at": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
      },
      "available": {
        "type": "boolean"
      }
    }
  }
}
  • settings:定义索引的集群级别配置。在这里,我们设置了 number_of_shardsnumber_of_replicas
  • mappings:包含模式定义。我们为每个字段定义 properties
    • product_id:用于精确匹配的 keyword 类型。
    • name:用于全文搜索的 text 类型,并带有额外的 keyword 子字段(name.raw)用于精确排序或聚合。
    • description:用于全文搜索的 text 类型。
    • price:用于数值操作的 float 类型。
    • stock:用于数值操作的 integer 类型。
    • created_at:带指定格式的 date 类型,以确保正确解析。
    • available:用于布尔值的 boolean 类型。

提示: 仔细规划您的映射。一旦索引创建并填充数据,就无法直接更改现有字段的数据类型,除非重新索引数据。请提前规划好您的数据类型和分析需求。

查看索引详情和设置

创建索引后,您通常需要检查其配置以确认设置、验证映射或排查问题。GET 命令是您获取索引全面信息的主要工具。

获取所有索引信息

要获取特定索引的所有设置、映射、别名和其他元数据,请使用带索引名称的 GET 命令。

GET /products

这将返回一个包含详细信息的大型 JSON 对象,包括:

{
  "products": {
    "aliases": {},
    "mappings": {
      "properties": {
        "available": {
          "type": "boolean"
        },
        "created_at": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
        },
        "description": {
          "type": "text"
        },
        "name": {
          "type": "text",
          "fields": {
            "raw": {
              "type": "keyword"
            }
          }
        },
        "price": {
          "type": "float"
        },
        "product_id": {
          "type": "keyword"
        },
        "stock": {
          "type": "integer"
        }
      }
    },
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data_content"
            }
          }
        },
        "number_of_shards": "3",
        "provided_name": "products",
        "creation_date": "1701234567890",
        "number_of_replicas": "2",
        "uuid": "some_uuid",
        "version": {
          "created": "7170099"
        }
      }
    }
  }
}

获取特定索引信息

您可以通过将索引配置的特定部分附加到 URL 来仅检索这些部分。

  • 仅获取映射:
    bash GET /products/_mapping

  • 仅获取设置:
    bash GET /products/_settings

  • 仅获取别名:
    bash GET /products/_alias

这种有针对性的检索在您只对索引的某个特定方面感兴趣时非常有用,使输出更易于管理。

查看多个索引

您还可以通过逗号分隔索引名称或使用通配符来检索多个索引的信息。

  • 特定的多个索引:
    bash GET /products,my_first_index/_settings

  • 所有以 'p' 开头的索引:
    bash GET /p*/_mapping

  • 所有索引(在生产环境中请谨慎使用):
    bash GET /_all # or GET /*

注意: 当使用 GET /_allGET /* 时,如果您的集群有大量索引,请准备好接收一个可能非常大的响应。请明智地使用它,特别是在生产环境中。

删除 Elasticsearch 索引

删除索引是一个永久性操作,它会删除所有相关的文档和元数据。这通常用于释放磁盘空间、删除旧数据或清理测试索引。DELETE 方法用于执行此关键操作。

删除单个索引

要删除单个索引,请使用 DELETE 命令,后跟索引名称。

DELETE /my_first_index

成功删除将返回:

{
  "acknowledged": true
}

警告: 此操作不可逆。一旦索引被删除,其数据将永远消失,除非您有快照或备份。在执行 DELETE 命令之前,务必仔细检查索引名称,尤其是在生产环境中。

删除多个索引

GET 类似,您可以通过逗号分隔的列表或使用通配符来删除多个索引。

  • 删除特定的多个索引:
    bash DELETE /my_old_index_1,my_old_index_2

  • 删除所有符合模式的索引:
    bash DELETE /logstash-2023-*
    此命令将删除所有名称以 logstash-2023- 开头的索引。

  • 删除所有索引(极其谨慎!):
    bash DELETE /_all # or DELETE /*

    危险! 删除 _all* 将从您的集群中删除 每一个索引。这是一项极具破坏性的操作,除非您明确打算擦除整个集群并拥有完善的恢复计划,否则 绝不 应在生产环境中执行。许多生产集群会禁用此功能,以防止意外数据丢失。

删除的最佳实践

  • 始终验证: 在删除之前,使用 GET 命令检查您打算删除的索引(或通过通配符指定的多个索引)。这可以确认您正在针对正确的数据。
    bash GET /logstash-2023-*
    检查输出,如果与您的预期相符,则继续执行 DELETE 操作。
  • 权限: 确保执行 DELETE 命令的用户或角色具有必要的权限。在生产环境中,应仅将 DELETE 权限限制给授权人员。
  • 快照: 在执行任何大规模删除操作之前,务必对您的集群进行快照,特别是当数据至关重要时。

比较与生命周期管理

这三个命令(PUT 用于创建,GET 用于检查,DELETE 用于删除)构成了手动索引生命周期管理的支柱。它们在不同阶段使用:

  • 创建 (PUT): 在索引生命周期的开始阶段,定义其结构和初始配置。
  • 检查 (GET): 在索引的整个活跃生命周期中,用于监控、故障排除和验证。
  • 删除 (DELETE): 在索引使用寿命结束时,用于回收资源和管理数据保留策略。

虽然这些命令非常适合临时或程序化管理,但 Elasticsearch 还提供了强大的自动化索引生命周期管理 (ILM) 功能。ILM 策略允许您定义规则,根据年龄、大小或其他标准,自动将索引通过各个阶段(热、温、冷、删除)进行转换,包括缩小、强制合并以及最终删除等操作。对于大规模或长期数据保留,ILM 是自动化 DELETE 阶段的推荐方法。

总结

通过 API 命令管理 Elasticsearch 索引是任何使用该平台的人都不可或缺的技能。您已经学会了如何使用 PUT 创建具有精确映射和设置的索引,使用 GET 彻底检查其配置,以及使用 DELETE 安全地删除它们。通过理解和正确应用这些命令,您可以对数据存储获得细粒度控制,并确保您的 Elasticsearch 集群保持高效、组织良好和高性能。

请始终牢记:仔细规划映射的重要性、删除前的认真验证,以及利用 Elasticsearch 内置的 ILM 等功能进行高级自动化生命周期管理。有了这些工具和最佳实践,您就能够很好地掌握 Elasticsearch 索引管理。如需进一步探索,请深入了解高级映射选项、索引模板以及 Elasticsearch 索引生命周期管理策略的全部功能。