正如你所知,为了搜索(和分析)
Elasticsearch是位于Elastic Stack核心的分布式搜索和分析引擎。Logstash和Beats便于收集、聚合和丰富数据,并将其存储在Elasticsearch中。Kibana使您能够交互式地探索、可视化和共享对数据的见解,并管理和监视stack。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_point和geo_shape
为了不同的目的,以不同的方式索引同一字段通常很有用。例如,您可能希望将字符串字段索引为全文搜索的文本字段和排序或聚合数据的关键字字段。或者,您可以选择使用多个语言分析器来处理包含用户输入的字符串字段的内容。
在索引期间应用于全文字段的分析链也在搜索时使用。查询全文字段时,在索引中查找术语之前,查询文本会进行相同的分析。
信息输出:搜索和分析
虽然您可以将Elasticsearch用作文档存储和检索文档及其元数据,但真正的强大之处在于能够轻松访问构建在Apache Lucene搜索引擎库上的全套搜索功能。
Elasticsearch提供了一个简单、一致的REST API,用于管理集群、索引和搜索数据。出于测试目的,您可以直接从命令行或通过Kibana中的开发人员控制台轻松提交请求。在应用程序中,您可以使用Elasticsearch客户端来选择语言:Java、JavaScript、Go。NET、PHP、Perl、Python或Ruby。
搜索您的数据
Elasticsearch RESTAPI支持结构化查询、全文查询和结合这两者的复杂查询。结构化查询类似于可以在SQL中构造的查询类型。例如,您可以搜索员工索引中的性别和年龄字段,并按hire_date字段对匹配项进行排序。全文查询会找到与查询字符串匹配的所有文档,并按相关性对其进行排序,以确定它们与搜索词的匹配程度。
除了搜索单个术语外,您还可以执行短语搜索、相似性搜索和前缀搜索,并获得自动完成建议。
是否有要搜索的地理空间或其他数字数据?Elasticsearch在支持高性能地理和数值查询的优化数据结构中索引非文本数据。
您可以使用Elasticsearch的综合JSON风格查询语言(查询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用作管理集群的控制中心。数据汇总和索引生命周期管理等功能可帮助您随着时间的推移智能地管理数据。