你知道,为了搜索(和分析)
Elasticsearch是分布式搜索和分析引擎于Elastic Stack核心中。Logstash和Beats有助于收集、聚合和丰富数据,并将其存储在Elasticsearch中。Kibana使你能够交互式地探索、可视化和共享对数据的洞察,并管理和监视堆栈。elasticsearch是索引、搜索和分析的神奇之处。
Elasticsearch为所有类型的数据提供实时搜索和分析。无论您拥有结构化或非结构化文本、数值数据或地理空间数据,Elasticsearch都可以以支持快速搜索的方式有效地存储和索引这些数据。你可以以超越简单的数据检索和聚合信息来发现数据中的趋势和模式。随着数据和查询量的增长,Elasticsearch的分布式特性使您的部署能够无缝地增长。
虽然并不是所有的问题都是搜索问题,但是Elasticsearch在多种用例中处理数据提供了速度和灵活性:
我们总是对人们使用搜索的新奇方式感到惊讶。但是,无论您的用例是否类似于其中一个,或者您正在使用Elasticsearch处理一个新问题,在Elasticsearch中处理数据、文档和索引的方式都是相同的。
Elasticsearch是一个分布式文档存储。Elasticsearch不是将信息存储为列数据行,而是存储将结构复杂数据序列化为JSON的文档。当集群中有多个Elasticsearch节点时,存储的文档分布在集群中,可以从任何节点立即访问。
当一个文档被存储时,它会被索引,并且可以在1秒内进行近实时搜索。Elasticsearch使用一种称为反向索引(inverted index)的数据结构,支持非常快速的全文搜索。反向索引列出任何文档中出现的每个唯一单词,并标识每个单词所在的所有文档。
索引可以看作是文档的优化集合,每个文档都是字段的集合,字段是包含数据的键值对。默认情况下,Elasticsearch索引每个字段中的所有数据,每个索引字段都有一个专用的优化的数据结构。例如,文本字段存储在反向索引中,数字和地理字段存储在BKD树中。使用每个字段的数据结构来组装和返回搜索结果的能力使得Elasticsearch如此快速。
Elasticsearch还具有无模式的能力,这意味着可以在不显式指定如何处理文档中可能出现的每个不同字段的情况下对文档进行索引。启用动态映射后,Elasticsearch自动检测并向索引添加新字段。这种默认行为使索引和探索数据变得很容易——只要开始索引文档,Elasticsearch就会检测布尔值、浮点数和整数值、日期和字符串,并将它们映射到适当的Elasticsearch数据类型。
然而,最终,你比Elasticsearch更了解你的数据以及如何使用它。您可以定义规则来控制动态映射,并显式定义映射来完全控制字段的存储和索引方式。
自定义映射使你能够:
为不同的目的以不同的方式索引相同的字段通常是有用的。例如,您可能希望将字符串字段作为全文搜索的文本字段和用于排序或聚合数据的关键字字段建立索引。或者,您可能选择使用多个语言分析器来处理包含用户输入的字符串字段的内容。
在索引期间应用于全文字段的分析链也用于搜索时。在terms可以在索引中被查看到之前,查询全文字段时查询文本将进行相同的分析。
虽然您可以使用Elasticsearch来进行文档存储和检索文档及其元数据,但真正强大的功能来自于能够轻松访问Apache Lucene搜索引擎库上构建的全套搜索功能。
Elasticsearch提供了一个简单、一致的REST API,用于管理集群、索引和搜索数据。出于测试目的,您可以很容易地直接从命令行或通过Kibana中的开发人员控制台提交请求。在您的应用程序中,你可以根据你选择使用的语言来选择Elasticsearch客户机:Java、JavaScript、Go、. net、PHP、Perl、Python或Ruby。
Searching your data
Elasticsearch REST api支持结构化查询、全文查询和组合这两种查询的复杂查询。结构化查询类型类似于用SQL构造的查询。例如,您可以搜索employee索引中的性别和年龄字段,并根据hire_date字段对匹配项进行排序。全文查询查找所有匹配查询字符串的文档,并按相关度对它们进行排序——它们与搜索项的匹配程度。
除了搜索单个terms外,还可以执行短语搜索、相似性搜索和前缀搜索,并获得自动获取建议。
想要搜索的地理空间或其他数值数据?通过优化数据结构,Elasticsearch支持在地理和数值查询中高性能的索引非文本数据。
您可以使用Elasticsearch的全面json风格的查询语言(查询DSL)访问所有这些搜索功能。您还可以构造SQL风格的查询,以便在Elasticsearch中原生地搜索和聚合数据,JDBC和ODBC驱动程序支持广泛的第三方应用程序通过SQL与Elasticsearch交互。
Analyzing your data
Elasticsearch聚合使您能够构建数据的复杂摘要,并深入了解关键指标、模式和趋势。聚合不是简单地在大海捞针,而是让您能够回答以下问题:
干草堆里有多少针?
针的平均长度是多少?
按制造商分类,针的平均长度是多少?
在过去的六个月里,每年有多少针被加到草堆里?
您还可以使用聚合来回答更微妙的问题,比如:
最受你欢迎的针具制造商是什么?
有不寻常或异常的针吗?
因为聚合利用了用于搜索的相同数据结构,所以它们的速度也非常快。这使您能够实时分析和可视化数据。您的报告和仪表板会随着数据的更改而更新,以便您可以根据最新的信息采取行动。
此外,聚合与搜索请求一起运行。您可以在单个请求中搜索文档、过滤结果并同时对相同的数据执行分析。因为聚合是在特定搜索的上下文中计算的,所以您不仅可以显示所有70针的数量,还可以显示匹配用户搜索条件的70针的数量——例如,所有70针的不粘绣花针。
但是等等,这还有更多的编辑
想要自动分析您的时间序列数据吗?您可以使用机器学习特性在数据中创建正常行为的精确基线,并识别异常模式。使用机器学习,您可以检测:
异常与数值、计数或频率的时间偏差有关
统计罕见
群体成员的不寻常行为
最棒的是什么?您不需要指定算法、模型或其他与数据科学相关的配置就可以做到这一点。
Elasticsearch可根据您的需要进行伸缩,构建始终可用。这是通过自然的分布式来实现的。您可以将服务器(节点)添加到集群中,以增加容量,Elasticsearch会自动在所有可用节点上分布数据和查询负载。无需彻底修改您的应用程序,Elasticsearch知道如何平衡多节点集群以提供伸缩性和高可用性。节点越多越好。
它是如何工作的?实际上,Elasticsearch索引只是一个或多个物理分片的逻辑分组,其中每个分片实际上是一个自包含(一篇文档同时包含字段和它们的取值)索引。将文档切分为多个分片分发到一个索引中,并跨多个节点分发这些分片,Elasticsearch将确保冗余,这既可以防止硬件故障,又可以在节点添加到集群时增加查询能力。随着集群的增长(或收缩),Elasticsearch自动迁移分片以重新平衡集群。
分片有两种类型:主分片和副本分片。索引中的每个文档都属于一个主分片。复制分片是主分片的副本。副本提供数据的冗余副本,以防止硬件故障,并增加处理读取请求(如搜索或检索文档)的能力。
索引中主分片的数量在创建索引时是固定的,但是可以随时更改复制分片的数量,而不会中断索引或查询操作。
这取决于……
在分片大小和为索引配置的主分片数量方面,有许多性能考虑因素和权衡。分片越多,维护这些索引的开销就越大。分片大小越大,当Elasticsearch需要重新平衡集群时,分片移动所需的时间就越长。
查询大量小分片可以加快每个分片的处理速度,但是查询越多意味着开销越大,因此查询少量较大分片可能会更快。简而言之,这要视情况而定。
这是一个开头:
目标是将分片的平均大小保持在几GB到几十GB之间。对于基于时间的数据的用例,通常可以看到20GB到40GB范围内的分片。
避免大量分片问题。节点可以容纳的分片数量与可用堆空间成正比。一般来说,每GB堆空间的分片数应该小于20。
确定用例最佳配置的最佳方法是使用您自己的数据和查询进行测试。
万一发生灾难
出于性能原因,集群中的节点需要位于同一网络上。在不同数据中心的节点之间平衡集群中的分片花费的时间太长了。但是高可用性架构要求您避免将所有鸡蛋放在一个篮子里。在一个位置发生重大停机时,需要能够有接管的另一个位置的服务器。无缝的切换的原因?Cross-cluster复制(CCR)。
CCR提供了一种方法,可以将主集群的索引自动同步到可作为热备份的辅助远程集群。如果主集群出现故障,则可以由辅助集群接管。您还可以使用CCR创建辅助集群,以在地理位置上接近您的用户,为读取请求提供服务。
跨集群复制是主动-被动的。主集群上的索引是active leader索引,处理所有写请求。复制到辅助集群的索引是只读跟踪器。
维护与成长
与任何企业系统一样,您需要工具来保护、管理和监视您的Elasticsearch集群。与Elasticsearch集成的安全性、监视和管理特性使您能够使用Kibana作为管理集群的控制中心。像数据滚动和索引生命周期管理这样的特性可以帮助您随着时间的推移智能地管理数据