本文主要记录官方文档学习过程
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_point和geo_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数目