elastic search 的能力
最近接到公司的一个需求,要求做用户在线分析。要做深度数据分析,因此选择了elastic的作为数据库。
本文主要介绍 elastic search的能做些什么。
文档和索引
Elasticsearch是一个分布式文档存储。 Elasticsearch不会像关系型数据库那样, 把数据存储为一行,而是存储已序列化为JSON的复杂数据结构。当集群中有多个Elasticsearch节点时,存储的文档会分布在整个集群中,并且可以从任何节点立即访问。
存储文档时,将在1秒内几乎实时地对其进行索引和完全搜索。 Elasticsearch使用倒排索引的数据结构,该结构支持非常快速的全文本搜索。倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所属文档。
索引可以认为是文档的集合,每个文档都是json对象。默认情况下,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 REST API支持结构化查询,全文查询以及结合了两者的复杂查询。
-
结构化查询类似于您可以在SQL中构造的查询类型。例如,您可以在员工索引中搜索“性别”和“年龄”字段,然后按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。
与任何企业系统一样,需要工具来保护,管理和监视Elasticsearch集群。集成到Elasticsearch中的安全性,监视和管理功能使您可以将Kibana用作控制中心来管理集群。数据汇总和索引生命周期管理等功能可帮助您随着时间的推移智能地管理数据。