es学习(一)-简介

 本文主要记录官方文档学习过程
 https://www.elastic.co/guide/en/elasticsearch/reference/7.6/search-aggregations.html

简介

elasticsearch,以下简称es,是一个分布式的搜索和分析引擎,为所有类型的数据提供了实时(大概1s)搜索和分析,适用于以下场景:

  • 将搜索框添加到网站和app中
  • 存储、分析日志,指标和安全时间数据
  • 使用es作为地理信息系统(GIS)管理,集成和分析空间信息
  • 使用es作为存储引擎自动化业务工作流程

数据输入:文档和索引

es是一个分布式文档存储。不同于传统数据存储的是,它将数据存储成为序列化json文档的复杂数据结构。当集群有多个es节点时,存储的文档分布在集群中,并且从任何节点都能访问。

存储文档时,能在1秒内近乎实时的对其建立索引和搜索。因为,es使用 inverted index(反向索引或者倒排索引)的数据结构,这种结构能够进行快速的全文搜索。

索引可以看作优化的(或者说相似特性的)文档集合,文档是字段的集合,字段包含数据的键值对。默认情况下,es对每个字段中的所有数据建立索引,并且每个索引字段具有专用的优化数据结构。例如,文本字段存储在倒排索引中,数字或者地理位置字段存储在BKD树中。这就是为什么es如此之快的原因。

es默认无模式,即无需显示指定不同字段就可以对其进行索引。当启用动态映射后,es就会默认检测并向索引添加新字段,比如:将布尔值,浮点数和整数值,日期和字符串映射到适当的数据类型中

es也支持自定义规则来控制动态映射,显示定义映射以完全控制字段的存储和索引方式。自定义你自己的匹配规则,可以让你做到以下事情:

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

es支持对同一字段建立不同索引,比如将字符串字段索引为全文搜索的文本字段和索引关键字,以便对数据进行排序或汇总。

总结:
    这一节点是对es中数据存储方式和高效查询的一个简单介绍。
    首先明确数据组织方式,索引可以看作文档的集合,文档是字段的集合,而字段就是我们实际存储数据的键值对。
    然后,es支持动态映射的方式,对字段进行自动识别并添加不同类型的索引,也支持显示添加的方式

信息输出:搜索和分析

es真正强大的地方在于,es基于Apache Lucene搜索引擎库,可以轻松使用其提供的全套搜索功能。

搜索数据

es的rest-api支持结构化的查询,全文查询和结合两者的复杂查询。结构化查询类似在sql中构造的类型查询,比如:您可以在员工索引中搜索“性别”和“年龄”字段,然后按hire_date字段对匹配项进行排序;全文查询,会找到所有与查询字符串匹配的文档,然后按照relevance(对查询字符串的匹配度)排序。

除了搜索单个术语外,您还可以执行短语搜索,相似性搜索和前缀搜索,并获得自动完成建议(这个电商搜索功能用的比较多)

es使用优化过的数据结构支持高性能的地理位置和数字查询

es支持json-style的查询语言,以及sql-style的查询语言

分析数据

es聚集能帮你构建数据总结,帮你深入了解指标、模式和趋势。

由于聚合利用用于搜索相同的数据结构,所以非常快,可以帮助你实时分析数据和数据的可视化。

可伸缩性和弹性:集群,节点和分片

es天然支持分布式,可以根据需求自由扩展。

每个索引有一个或者多个分片,索引的数据被分配到各个分片上,相当于一桶水用多个杯子来装,这样做可以确保冗余,防止硬件故障和提高查询能力。

分片有两种类型:primaries(主分片)replicas(备份分片),索引中的文档都属于主分片,备份分片是主分片的拷贝。这个机制,主要用于容灾处理,以及提高查询速度。

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

权衡和取舍

在分片大小和索引主分片的数量方面,在性能方面需要做考量。因为,分片越多维护这些的开销就越大,分片越大,es重新平衡集群时分片移动所需时间就越大。

查询很多小的分片会使每个分片的处理速度更快,但是更多的查询(分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request)意味着更多的开销,因此查询较小数量的大分片可能会更快。

具体取舍,可以参考以下:

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

容灾

出于性能考虑,集群内的节点必须位于同一网络上。因为,不同网络的节点分片平衡花费的时间太长。高可用架构,需要备份。一旦一个地方发生故障,要有其他地方的节点能够接管。所以,es提供了解决方案,跨集群复杂(CCR, crossing-cluster replication)

CCR提供了一种方法,可以自动将索引从主群集同步到可以用作热备份的辅助远程群集。如果主集群挂了,备份集群可以接管。还可以把CCR用于创建辅助集群,以接近地理位置的方式给用户提供服务,以获取更好的体验。

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

以上,只是简单了解下es相关概念。
cluster:集群,一个集群由多个node组成,每个集群有个cluster name标识
node:一个es实例就是一个node,一个集群可以由多个实例
index:索引,即一系列相关文档的集合
shard:
    1)分片,每个索引有多个分片,索引的数据被分配到分片上,相当于一桶水n个杯子装
    2)分片有助于横向扩展,N个分片会被尽可能平均地(rebalance)分配在不同的节点上(例如你有2个节点,4个主分片(不考虑备份),那么每个节点会分到2个分片,后来你增加了2个节点,那么你这4个节点上都会有1个分片,这个过程叫relocation,ES感知后自动完成)。
    3)分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request。
    4)每个分片都是一个Lucene Index,所以一个分片只能存放 Integer.MAX_VALUE - 128 =2,147,483,519 个docs。
replica:
    1)复制,可以理解为备份分片,相应地有primary shard(主分片)。
    2)主分片和备分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建5个分片一个备份(即 5primary+5replica=10个分片)
    3)主要作用是容灾、提高查询性能
    4)对一个索引,除非重建索引否则不能调整主分片数,但可以随时调整replica数目