你知道,为了搜索(和分析)

Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和共享对数据的洞察,并管理和监控堆栈。Elasticsearch 是索引、搜索和分析魔法发生的地方。

Elasticsearch 为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数值数据还是地理空间数据,Elasticsearch 都可以以支持快速搜索的方式高效地存储和索引它。您可以超越简单的数据检索和聚合信息来发现数据中的趋势和模式。随着您的数据和查询量的增长,Elasticsearch 的分布式特性使您的部署能够随之无缝增长。

虽然并非所有问题都是搜索问题,但 Elasticsearch 提供了在各种用例中处理数据的速度和灵活性:

  • 向应用程序或网站添加搜索框
  • 存储和分析日志、指标和安全事件数据
  • 使用机器学习实时自动建模数据的行为
  • 使用 Elasticsearch 作为存储引擎自动化业务工作流
  • 使用 Elasticsearch 作为地理信息系统 (GIS) 管理、集成和分析空间信息
  • 使用 Elasticsearch 作为生物信息学研究工具存储和处理遗传数据

我们不断对人们使用搜索的新颖方式感到惊讶。但是,无论您的用例是否与其中之一类似,或者您正在使用 Elasticsearch 来解决新问题,您在 Elasticsearch 中处理数据、文档和索引的方式都是相同的。

数据输入:文档和索引

Elasticsearch 是一个分布式文档存储。Elasticsearch 不是将信息存储为列状数据的行,而是存储已序列化为 JSON 文档的复杂数据结构。当集群中有多个 Elasticsearch 节点时,存储的文档分布在整个集群中,并且可以从任何节点立即访问。

存储文档后,它会被编入索引,并且可以近乎实时地在1 秒内完全搜索。Elasticsearch 使用一种称为倒排索引的数据结构,它支持非常快速的全文搜索。倒排索引列出出现在任何文档中的每个唯一单词,并标识每个单词出现的所有文档。

可以将索引视为文档的优化集合,每个文档都是字段的集合,这些字段是包含您的数据的键值对。默认情况下,Elasticsearch 索引每个字段中的所有数据,每个索引字段都有一个专用的、优化的数据结构。例如,文本字段存储在倒排索引中,数值和地理字段存储在 BKD 树中。使用每个字段的数据结构来组合和返回搜索结果的能力使 Elasticsearch 如此之快。

Elasticsearch 还具有无模式的能力,这意味着可以在不明确指定如何处理文档中可能出现的每个不同字段的情况下为文档编制索引。启用动态映射后,Elasticsearch 会自动检测并将新字段添加到索引中。这种默认行为使索引和探索数据变得容易——只需开始索引文档,Elasticsearch 就会检测并将布尔值、浮点和整数值、日期和字符串映射到适当的 Elasticsearch 数据类型。

但是,归根结底,您比 Elasticsearch 更了解您的数据以及您希望如何使用它。您可以定义规则来控制动态映射并显式定义映射以完全控制字段的存储和索引方式。

定义您自己的映射使您能够:

  • 区分全文字符串字段和精确值字符串字段
  • 执行特定于语言的文本分析
  • 优化部分匹配的字段
  • 使用自定义日期格式
  • 使用无法自动检测到的 数据类型geo_pointgeo_shape

为了不同的目的以不同的方式索引相同的字段通常很有用。例如,您可能希望将字符串字段索引为用于全文搜索的文本字段和用于排序或聚合数据的关键字字段。或者,您可以选择使用多个语言分析器来处理包含用户输入的字符串字段的内容。

在索引期间应用于全文字段的分析链也在搜索时使用。当您查询全文字段时,在索引中查找术语之前,查询文本会经过相同的分析。

数据输出:搜索和分析

虽然您可以将 Elasticsearch 用作文档存储并检索文档及其元数据,但真正的强大之处在于能够轻松访问构建在 Apache Lucene 搜索引擎库上的全套搜索功能。

Elasticsearch 提供了一个简单、一致的 REST API 来管理您的集群以及索引和搜索您的数据。出于测试目的,您可以直接从命令行或通过 Kibana 中的开发人员控制台轻松提交请求。在您的应用程序中,您可以将 Elasticsearch 客户端 用于您选择的语言:Java、JavaScript、Go、.NET、PHP、Perl、Python 或 Ruby。

搜索您的数据

Elasticsearch REST API 支持结构化查询、全文查询和将两者结合的复杂查询。结构化查询类似于您可以在 SQL 中构造的查询类型。例如,您可以搜索索引中的gender和age字段并按字段employee对匹配项进行排序hire_date。全文查询查找与查询字符串匹配的所有文档,并按相关性排序返回它们——它们与您的搜索词的匹配程度。

除了搜索单个术语外,您还可以执行短语搜索、相似性搜索和前缀搜索,并获得自动完成建议。

有要搜索的地理空间数据或其他数字数据吗?Elasticsearch 在支持高性能地理和数值查询的优化数据结构中索引非文本数据。

您可以使用 Elasticsearch 的综合 JSON 样式查询语言 ( Query DSL )访问所有这些搜索功能。您还可以构建SQL 样式的查询以在 Elasticsearch 内部搜索和聚合数据,JDBC 和 ODBC 驱动程序使广泛的第三方应用程序能够通过 SQL 与 Elasticsearch 交互。

分析您的数据

Elasticsearch 聚合使您能够构建复杂的数据摘要并深入了解关键指标、模式和趋势。聚合不仅可以找到众所周知的“大海捞针”,还可以让您回答以下问题:

  • 大海捞针有多少针?
  • 针的平均长度是多少?
  • 制造商细分的针的中位数长度是多少?
  • 在过去的六个月中,每一个月都向大海捞针添加了多少针?

您还可以使用聚合来回答更微妙的问题,例如:

  • 您最受欢迎的针头制造商是哪些?
  • 是否有异常或异常的针团?

因为聚合利用了用于搜索的相同数据结构,所以它们也非常快。这使您能够实时分析和可视化数据。您的报告和仪表板会随着数据的变化而更新,以便您可以根据最新信息采取行动。

更重要的是,聚合与搜索请求一起运行。您可以在单个请求中对相同数据同时搜索文档、过滤结果和执行分析。并且因为聚合是在特定搜索的上下文中计算的,所以您不仅会显示所有 70 号针的计数,还显示了与用户搜索条件匹配的 70 号针的计数——例如,所有尺寸 70不粘绣花针。

但是等等,还有更多

想要自动化时间序列数据的分析吗?您可以使用 机器学习功能创建数据中正常行为的准确基线并识别异常模式。通过机器学习,您可以检测:

  • 与值、计数或频率的时间偏差相关的异常
  • 统计稀有度
  • 某个群体成员的异常行为

最好的部分是?您无需指定算法、模型或其他与数据科学相关的配置即可执行此操作。

可扩展性和弹性:集群、节点和分片

Elasticsearch 旨在始终可用并根据您的需求进行扩展。它通过自然分布来做到这一点。您可以将服务器(节点)添加到集群以增加容量,Elasticsearch 会自动在所有可用节点之间分配您的数据和查询负载。无需大修您的应用程序,Elasticsearch 知道如何平衡多节点集群以提供可扩展性和高可用性。节点越多越好。

这是如何运作的?在幕后,Elasticsearch 索引实际上只是一个或多个物理分片的逻辑分组,其中每个分片实际上是一个独立的索引。通过将索引中的文档分布在多个分片中,并将这些分片分布在多个节点上,Elasticsearch 可以确保冗余,这既可以防止硬件故障,又可以在将节点添加到集群时增加查询容量。随着集群的增长(或缩小),Elasticsearch 会自动迁移分片以重新平衡集群。

有两种类型的分片:主分片和副本。索引中的每个文档都属于一个主分片。副本分片是主分片的副本。副本提供数据的冗余副本,以防止硬件故障并增加处理读取请求(如搜索或检索文档)的容量。

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

这取决于……

关于分片大小和为索引配置的主分片数量,有许多性能考虑和权衡。分片越多,维护这些索引的开销就越大。分片大小越大,当 Elasticsearch 需要重新平衡集群时,移动分片所需的时间就越长。

查询大量小分片会使每个分片的处理速度更快,但更多查询意味着更多开销,因此查询较少数量的较大分片可能会更快。简而言之……视情况而定。

作为起点:

  • 旨在将平均分片大小保持在几 GB 到几十 GB 之间。对于具有基于时间的数据的用例,通常会看到 20GB 到 40GB 范围内的分片。
  • 避免大量碎片问题。一个节点可以容纳的分片数量与可用的堆空间成正比。作为一般规则,每 GB 堆空间的分片数应小于 20。

为您的用例确定最佳配置的最佳方法是 使用您自己的数据和查询进行测试。

发生灾害时

出于性能原因,集群中的节点需要位于同一网络上。跨不同数据中心的节点平衡集群中的分片只需要太长时间。但是高可用性架构要求您避免将所有鸡蛋放在一个篮子里。在一个位置发生重大中断的情况下,另一个位置的服务器需要能够接管。无缝。答案?跨集群复制 (CCR)。

CCR 提供了一种将索引从主集群自动同步到可用作热备份的辅助远程集群的方法。如果主集群出现故障,辅助集群可以接管。您还可以使用 CCR 创建辅助集群,以便为您的用户提供地理位置邻近的读取请求。

跨集群复制是主动-被动的。主集群上的索引是活动的领导者索引,处理所有写请求。复制到辅助集群的索引是只读的跟随者。

护理和喂养

与任何企业系统一样,您需要工具来保护、管理和监控您的 Elasticsearch 集群。集成到 Elasticsearch 中的安全、监控和管理功能使您能够将Kibana 用作管理集群的控制中心。类似的特征数据汇总和指标生命周期管理 可帮助您明智随着时间的推移管理您的数据。