Elasticsearch 基础

edit

Elasticsearch 基础

edit

本指南涵盖了您需要了解的核心概念,以便开始使用Elasticsearch。 如果您更愿意立即开始使用Elasticsearch,请设置一个本地开发环境并跳转到动手代码示例

本指南涵盖以下主题:

什么是Elasticsearch?

edit

Elasticsearch 是一个分布式搜索和分析引擎、可扩展的数据存储和向量数据库,基于Apache Lucene构建。 它针对生产规模工作负载的速度和相关性进行了优化。 使用Elasticsearch来搜索、索引、存储和分析各种形状和大小的数据,几乎实时进行。

Elasticsearch 是 Elastic Stack 的核心。 与 Kibana 结合使用,它驱动以下 Elastic 解决方案:

Elasticsearch 有很多功能。请在产品网页上探索完整列表。

用例

edit

Elasticsearch 被用于广泛且不断增长的用例范围。以下是一些例子:

可观测性

  • 日志、指标和追踪: 收集、存储和分析来自应用程序、系统和服务的日志、指标和追踪。
  • 应用程序性能监控 (APM): 监控和分析关键业务软件应用程序的性能。
  • 真实用户监控 (RUM): 监控、量化和分析用户与Web应用程序的交互。
  • OpenTelemetry: 重用现有的工具,使用OpenTelemetry标准将遥测数据发送到Elastic Stack。

搜索

  • 全文搜索: 使用倒排索引、分词和文本分析构建快速、相关的全文搜索解决方案。
  • 向量数据库: 存储和搜索向量化数据,并使用内置和第三方自然语言处理(NLP)模型创建向量嵌入。
  • 语义搜索: 使用同义词、密集向量嵌入和学习的稀疏查询-文档扩展等工具理解搜索查询背后的意图和上下文含义。
  • 混合搜索: 使用最先进的排名算法将全文搜索与向量搜索结合起来。
  • 构建搜索体验: 将混合搜索功能添加到应用程序或网站中,或基于组织的内部数据源构建企业搜索引擎。
  • 检索增强生成 (RAG): 使用 Elasticsearch 作为检索引擎,为生成式 AI 模型补充更相关、最新或专有的数据,以满足一系列用例需求。
  • 地理空间搜索: 使用地理空间查询搜索位置并计算空间关系。

安全

  • 安全信息和事件管理 (SIEM): 收集、存储和分析来自应用程序、系统和服务的安​​全数据。
  • 终端安全: 监控和分析终端安全数据。
  • 威胁狩猎: 搜索和分析数据以检测和响应安全威胁。

这只是Elasticsearch支持的搜索、可观测性和安全性用例的一个示例。 请参阅Elastic的客户成功案例,了解跨多个行业的具体示例。

运行 Elasticsearch

edit

要使用 Elasticsearch,您需要一个正在运行的 Elasticsearch 服务实例。 您可以通过多种方式部署 Elasticsearch。

快速开始选项

  • 本地开发: 使用最小的本地 Docker 设置快速开始开发和测试。

托管选项

高级选项

索引、文档和字段

edit

索引是 Elasticsearch 中存储的基本单位,是一个逻辑命名空间,用于存储具有相似特征的数据。 在您部署 Elasticsearch ,您将通过创建一个索引来开始存储您的数据。

索引是由名称或别名唯一标识的文档集合。 这个唯一的名称很重要,因为它用于在搜索查询和其他操作中定位索引。

一个密切相关的概念是数据流。 这个索引抽象是为仅追加的时间戳数据优化的,并且由隐藏的、自动生成的后备索引组成。 如果你正在处理时间戳数据,我们推荐使用Elastic Observability解决方案以获取额外的工具和优化的内容。

文档和字段

edit

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"
  }
}

元数据字段

edit

索引文档包含数据和元数据。元数据字段是存储有关文档信息的系统字段。 在Elasticsearch中,元数据字段以一个下划线为前缀。 例如,以下字段是元数据字段:

  • _index: 文档存储的索引名称。
  • _id: 文档的ID。每个索引中的ID必须是唯一的。

映射和数据类型

edit

每个索引都有一个映射或模式,用于定义文档中的字段如何被索引。 映射定义了每个字段的数据类型,字段应如何被索引, 以及它应如何存储。 当向Elasticsearch添加文档时,您有两种映射选项:

  • 动态映射:让 Elasticsearch 自动检测数据类型并为您创建映射。动态映射可以帮助您快速入门,但由于自动字段类型推断,可能会导致特定用例的次优结果。
  • 显式映射:通过为每个字段指定数据类型来提前定义映射。推荐用于生产用例,因为您可以完全控制如何为您的特定用例索引数据。

您可以在同一个索引上结合使用动态映射和显式映射。 这在您的数据中同时包含已知和未知字段时非常有用。

将数据添加到 Elasticsearch

edit

有多种方法可以将数据导入Elasticsearch。 您选择的选项取决于您处理的是带时间戳的数据还是不带时间戳的数据,数据来源,数据的复杂性等等。

您可以使用 Kibana 将 示例数据 加载到您的 Elasticsearch 集群中,以便快速开始。

一般内容

edit

通用内容是指不包含时间戳的数据。 这可以是诸如向量嵌入、网站内容、产品目录等数据。 对于通用内容,您有以下选项可以将数据添加到Elasticsearch索引中:

  • API: 使用 Elasticsearch Document APIs 直接索引文档,使用 Dev Tools Console 或 cURL。

    如果您正在构建网站或应用程序,那么您可以使用您选择的编程语言中的 Elasticsearch 客户端 调用 Elasticsearch API。如果您使用 Python 客户端,那么请查看 elasticsearch-labs 仓库,获取各种 示例笔记本

  • 文件上传: 使用 Kibana 文件上传器为一次性测试和探索索引单个文件。GUI 会引导您完成设置索引和字段映射的过程。
  • 网络爬虫: 提取并索引网页内容到 Elasticsearch 文档中。
  • 连接器: 从各种第三方数据源同步数据,以在 Elasticsearch 中创建可搜索的只读副本。

带时间戳的数据

edit

Elasticsearch 中的时间戳数据指的是包含时间戳字段的数据集。如果你使用 Elastic Common Schema (ECS),这个字段名为 @timestamp。 这可以是日志、指标和跟踪等数据。

对于带有时间戳的数据,您有以下选项可以将数据添加到 Elasticsearch 数据流中:

  • Elastic Agent 和 Fleet:索引时间戳数据的推荐方式。每个基于 Elastic Agent 的集成都包含默认的摄取规则、仪表板和可视化,以便您可以立即开始分析您的数据。 您可以使用 Kibana 中的 Fleet UI 集中管理 Elastic Agents 及其策略。
  • Beats:如果您的数据源不受 Elastic Agent 支持,请使用 Beats 收集数据并将其发送到 Elasticsearch。您需要为每种要收集的数据类型安装一个单独的 Beat。
  • Logstash:Logstash 是一个具有实时管道功能的开源数据收集引擎,支持多种数据源。您可能会选择此选项,因为 Elastic Agent 和 Beats 都不支持您的数据源。您还可以使用 Logstash 来持久化传入的数据,或者如果您需要将数据发送到多个目的地。
  • 语言客户端:链接的教程展示了如何使用 Elasticsearch 编程语言客户端从应用程序中摄取数据。在这些示例中,Elasticsearch 运行在 Elastic Cloud 上,但相同的原理适用于任何 Elasticsearch 部署。

如果您对时间戳数据的摄取管道感兴趣,请使用Elastic Cloud 文档中的决策树来了解您的选项。

搜索和分析数据

edit

您可以将 Elasticsearch 用作基本文档存储来检索文档及其元数据。 然而,Elasticsearch 的真正强大之处在于其高级搜索和分析功能。

您将结合使用API端点和查询语言来与您的数据进行交互。

REST API

edit

使用REST API来管理您的Elasticsearch集群,并对您的数据进行索引和搜索。 为了测试目的,您可以直接从命令行或通过Kibana中的Dev Tools Console提交请求。 从您的应用程序中,您可以使用您选择的编程语言中的客户端

请参考Elasticsearch入门,了解如何使用_search端点、向Elasticsearch添加数据以及在查询DSL语法中运行基本搜索的实践示例。

查询语言

edit

Elasticsearch 提供了多种查询语言来与您的数据进行交互。

查询DSL 是Elasticsearch目前的主要查询语言。

ES|QL 是一种新的管道查询语言和计算引擎,首次添加于版本 8.11

ES|QL 尚未支持 Query DSL 的所有功能,如全文搜索和语义搜索。 期待在每次发布中看到新的 ES|QL 功能和功能。

请参阅查询语言以获取Elasticsearch中可用的查询语言的完整概述。

查询DSL
edit

查询DSL是一种功能齐全的JSON风格查询语言,能够实现复杂的搜索、过滤和聚合。 它是Elasticsearch目前最原始且最强大的查询语言。

The _search endpoint 接受使用查询DSL语法编写的查询。

使用查询DSL进行搜索和过滤
edit

查询DSL支持多种搜索技术,包括以下内容:

  • 全文搜索:搜索已分析和索引的文本,以支持短语或邻近查询、模糊匹配等。
  • 关键词搜索:使用keyword字段进行精确匹配搜索。
  • 语义搜索:在您的Elasticsearch集群中生成的嵌入上使用密集或稀疏向量搜索semantic_text字段。
  • 向量搜索:使用kNN算法搜索与Elasticsearch外部生成的嵌入相似的密集向量。
  • 地理空间搜索:使用地理空间查询搜索位置并计算空间关系。

了解Query DSL支持的完整查询范围。

您还可以使用查询DSL过滤数据。 过滤器使您能够通过检索符合特定字段级别条件的文档来包含或排除文档。 使用filter参数的查询表示过滤上下文

使用查询DSL进行分析
edit

聚合是使用查询DSL分析Elasticsearch数据的主要工具。 聚合使您能够构建数据的复杂摘要,并深入了解关键指标、模式和趋势。

因为聚合利用了用于搜索的相同数据结构,所以它们也非常快。这使得您能够实时分析和可视化您的数据。您可以在同一数据上同时搜索文档、过滤结果并执行分析,所有这些操作都在一个请求中完成。这意味着聚合是在搜索查询的上下文中计算的。

以下聚合类型可用:

  • Metric: 计算字段值的指标,例如总和或平均值。
  • Bucket: 根据字段值、范围或其他条件将文档分组到桶中。
  • Pipeline: 对其他聚合的结果运行聚合。

通过指定搜索APIaggs参数来运行聚合。 了解更多信息请参阅运行聚合

ES|QL
edit

Elasticsearch 查询语言 (ES|QL) 是一种用于过滤、转换和分析数据的管道查询语言。 ES|QL 构建在一个新的计算引擎之上,其中搜索、聚合和转换函数直接在 Elasticsearch 本身中执行。 ES|QL 语法也可以在各种 Kibana 工具中使用。

The _query endpoint 接受使用 ES|QL 语法编写的查询。

今天,它支持Query DSL中可用功能的一个子集,如聚合、过滤和转换。 它还不支持全文搜索或语义搜索。

它配备了一套全面的函数和操作符,用于处理数据,并与Kibana的Discover、仪表板和可视化功能进行了强大的集成。

了解更多信息请参阅ES|QL 入门,或尝试我们的培训课程

可用查询语言列表

edit

下表总结了所有可用的Elasticsearch查询语言,以帮助您为您的用例选择合适的查询语言。

Name Description Use cases API endpoint

查询DSL

Elasticsearch 的主要查询语言。一种强大且灵活的 JSON 风格语言,能够实现复杂的查询。

全文搜索、语义搜索、关键词搜索、过滤、聚合等功能。

_search

ES|QL

8.11中引入的Elasticsearch查询语言(ES|QL)是一种用于过滤、转换和分析数据的管道查询语言。

最初针对处理时间序列数据(如日志和指标)进行了优化。 与Kibana的强大集成,用于查询、可视化和分析数据。 尚不支持全文搜索。

_query

EQL

事件查询语言(EQL)是一种用于基于事件的时间序列数据的查询语言。数据必须包含@timestamp字段才能使用EQL。

专为威胁狩猎安全用例设计。

_eql

Elasticsearch SQL

允许对Elasticsearch数据进行原生、实时的类SQL查询。提供JDBC和ODBC驱动程序,以便与商业智能(BI)工具集成。

使熟悉SQL的用户能够使用熟悉的语法查询Elasticsearch数据,用于BI和报告。

_sql

Kibana查询语言 (KQL)

Kibana查询语言(KQL)是一种基于文本的查询语言,用于在通过Kibana用户界面访问数据时进行过滤。

使用KQL过滤文档,其中字段的值存在、匹配给定值或位于给定范围内。

不适用

准备投入生产

edit

许多团队依赖Elasticsearch来运行他们的关键服务。为了保持这些服务的运行,您可以设计您的Elasticsearch部署,以保持Elasticsearch的可用性,即使在发生大规模中断的情况下。为了保持其快速运行,您还可以设计您的部署,以响应生产工作负载。

Elasticsearch 旨在始终保持可用状态,并根据您的需求进行扩展。它通过分布式架构实现这一点。通过分布集群,您可以保持 Elastic 在线并对请求做出响应。

在失败的情况下,Elasticsearch 提供了跨集群复制和集群快照工具,可以帮助您快速回退或恢复。您还可以使用跨集群复制来根据用户的地理位置和您的资源来提供请求。

Elasticsearch 还提供了安全性和监控工具,帮助您保持集群的高可用性。

使用多个节点和分片

edit

节点和分片是使 Elasticsearch 分布式和可扩展的原因。

如果你刚开始学习,这些概念并不是必须的。你如何部署 Elasticsearch 在生产环境中决定了你需要了解什么:

  • 自托管 Elasticsearch: 您负责设置和管理节点、集群、分片和副本。这包括管理底层基础设施、扩展以及通过故障转移和备份策略确保高可用性。
  • Elastic 云: Elastic 可以根据工作负载变化自动扩展资源。选择不同的部署类型以应用适合您用例的合理默认值。对节点、分片和副本的基本理解仍然很重要。
  • Elastic 云无服务器: 您无需担心节点、分片或副本。这些资源在无服务器平台上100%自动化,旨在随您的工作负载进行扩展。

您可以向集群中添加服务器(节点)以增加容量,并且 Elasticsearch 会自动在所有可用节点之间分发您的数据和查询负载。

Elastic 能够通过将索引细分为 分片 来在节点之间分布您的数据。Elasticsearch 中的每个索引都是一个或多个物理分片的分组,其中每个分片是一个自包含的 Lucene 索引,包含索引中的一部分文档。通过将索引中的文档分布到多个分片,并将这些分片分布到多个节点,Elasticsearch 提高了索引和查询的容量。

有两种类型的分片:主分片副本分片。索引中的每个文档都属于一个主分片。副本分片是主分片的副本。副本在集群中的节点之间维护数据的冗余副本。这可以防止硬件故障并增加处理读取请求(如搜索或检索文档)的能力。

索引中的主分片数量在索引创建时是固定的,但副本分片的数量可以随时更改,而不会中断索引或查询操作。

集群中的分片副本会自动在节点之间进行平衡,以提供扩展性和高可用性。所有节点都了解集群中的所有其他节点,并可以将客户端请求转发到适当的节点。这使得Elasticsearch能够在集群中分配索引和查询负载。

如果你是第一次探索 Elasticsearch 或在开发环境中工作,那么你可以使用一个单节点集群并创建只有一个分片的索引。然而,在生产环境中,你应该构建一个多节点集群和具有多个分片的索引,以提高性能和韧性。

要了解如何优化集群中的分片数量和大小,请参阅分片大小。 要了解读写操作如何在分片和分片副本之间复制,请参阅读写文档。 要调整分片在节点之间的分配和平衡方式,请参阅分片分配、迁移和恢复

用于灾难恢复和地理邻近性的CCR

edit

为了有效地在节点之间分配读写操作,集群中的节点需要良好的、可靠的连接。为了提供更好的连接,通常将节点放置在同一个数据中心或附近的数据中心。

将节点放置在单一位置会使您面临单点故障的风险,这可能导致整个集群离线。为了保持高可用性,您可以通过实施跨集群复制(CCR)来准备一个备用集群,以便在灾难发生时接管服务。

CCR 提供了一种自动将索引从主集群同步到可以作为热备份的辅助远程集群的方法。如果主集群发生故障,辅助集群可以接管。

您还可以使用CCR创建辅助集群,以便在地理位置上接近用户的地方处理读取请求。

了解更多关于跨集群复制以及关于设计弹性的内容。

您还可以对集群进行快照,以便在发生故障时可以恢复。

安全与监控

edit

与任何企业系统一样,您需要工具来保护、管理和监控您的 Elasticsearch 集群。集成到 Elasticsearch 中的安全、监控和管理功能使您能够使用 Kibana 作为管理集群的控制中心。

了解如何保护Elasticsearch集群

了解如何监控您的集群

集群设计

edit

Elasticsearch 提供了许多选项,使您能够配置集群以满足您组织的目标、要求和限制。您可以查看以下指南,了解如何调整集群以满足您的需求:

许多Elasticsearch选项都有不同的性能考虑和权衡。确定适合您使用场景的最佳配置的最佳方法是通过使用您自己的数据和查询进行测试