ElasticSearch学习

目录

1 基本概念

1.1 检索概念

2 Lucene

2.1 简介

2.1.1 Lucene基本流程

2.1.2 Lucene特性说明

2.2 基本概念及操作

2.2.1 检索建模

2.2.2 创建索引

2.2.3 更新索引

2.3 Lucene底层数据结构及原理

2.4 Lucene的评分机制

3 ElasticSearch

3.1 定位及竞品对比

3.2 分布式架构设计

3.2.1 Zen Discovery 模块

3.2.2 分布式架构

3.3 系统通信

3.4 文件存储

3.5 水平扩容

9 参考资料

0 其他


1 基本概念

1.1 检索概念

Es 索引、类型、文档、Field 分别怎么理解?这些概念背后的物理含义。

名称

概念

对应关系型数据库概念

说明

备注

Cluster

集群

 

一个或多个节点的集合,通过启动时指定名字作为唯一标识,默认cluster-state

 

node

节点

 

启动的ES的单个实例,保存数据并具有索引和搜索的能力,通过名字唯一标识,默认node-n

 

index

索引

Database

具有相似特点的文档的集合,可以对应为关系型数据库中的数据库,通过名字在集群内唯一标识

 

type

文档类别

Table

索引内部的逻辑分类,可以对应为Mysql中的表,ES 6.x 版本中,一个索引只允许一个type,不再支持多个type。7.x版本中,type将废弃。

 

document

文档

Row

构成索引的最小单元,属于一个索引的某个类别,从属关系为: Index -> Type -> Document,通过id 在Type 内唯一标识。

也是构建索引和查询的最小单位

 

field

字段

Column

构成文档的单元

比如对于一篇,论文,作者、标题、正文、发表时间

mapping

索引映射(约束)

Schema

用来约束文档字段的类型,可以理解为索引内部结构。类似数据库中的表定义。核心数据类型:

字符串 text, 字符串:keyword 数值型、布尔型、日期型、范围型

http://laijianfeng.org/2018/08/Elasticsearch-6-x-Mapping%E8%AE%BE%E7%BD%AE/

shard

分片

 

将索引分为多个块,每块叫做一个分片。索引定义时需要指定分片数且不能更改,默认一个索引有5个分片,每个分片都是一个功能完整的Index,分片带来规模上(数据水平切分)和性能上(并行执行)的提升,是ES数据存储的最小单位

 

replicas

分片的备份

 

每个分片默认一个备份分片,它可以提升节点的可用性,同时能够提升搜索时的并发性能(搜索可以在全部分片上并行执行)

 

 

2 Lucene

2.1 简介

2.1.1 Lucene基本流程

 

 

2.1.2 Lucene特性说明

非实时,从建索引到可以搜索中间有一个时间延迟,而当前的“近实时”(Lucene Near Real Time search)搜索方案的可扩展性有待进一步完善

非实时,从建索引到可以搜索中间有一个时间延迟???这个时间间隔具体在干什么? 为什么Lucene不实时?

Es采用了近实时方案,Es怎么解决Lucene的那个时间间隔的问题?

Es的解决方式是引入了一个FileSystemCache,在内存中生成索引之后,如果写到磁盘比较慢,但是如果先写到FileSystemCache中,速度非常快,生成到FileSystemCahce就可以使用索引了,后续的问题再交由FileSystemCache中。

 

[Lucene版本变迁] https://blog.csdn.net/jiangchao858/article/details/78897818

 

2.2 基本概念及操作

2.2.1 检索建模

文档、Filed、term

类关系图

 

从上述类关系图就可以看出来,Document只是一个Field的容器,并没有格式化的scheme,即不同的Document可以有不同名称的Field。

 

构建和查询的最小单元:文档是构建索引的最小单元,Field是索引查询的最小单元。

构建索引的时候

indexWriter.addDocument(doc);

从上述代码可以看出doc是构建索引的单元;查询的时候是指定一个索引目录,查询的过程就是在这个查询目录下进行,查询的时候可以指定在某个Field下查询,所以查询的最小单元是Field。

 

不同Filed之间的区别:

Field StringField和TextField的区别,是否tokenized。简而言之,是否作为一个整体去索引。

2.2.2 创建索引

示意图:

 

创建方式:

创建有三种,通过IndexWriterConfig.OpenMode进行指定,分别是

  • CREATE:创建一个新的索引或者覆写已经存在的索引

  • APPEND:打开一个已经存在的索引

  • CREATE_OR_APPEND:如果不存在则创建新的索引,如果存在则追加索引

 

2.2.3 更新索引

先删除再新建;注意:只可根据索引的字段进行更新。

 

2.3 Lucene底层数据结构及原理

DocId的编码、term的存储

2.3.1 term存储

原始数据怎么高效存储?

倒排表怎么高效存储? FST (从Lucene4开始,从Lucene3开始,在3及其以前是使用跳表,但是跳表对模糊查询支持不好,故改成了跳表)

倒排表的形式决定了key大部分的前缀或者后缀是可以高效利用的。

采用这种是为了加载到内存中,如果不能加载到内存中,怎么办?

 

2.2.3

通过FST找对对应的docIds(docId都是有序集合)之后,如何并集、交集、差集。

 

交集:

[有序数组求交集方法] http://www.6aiq.com/article/1559927141249?p=1&m=0

Lucene5开始使用了bitMap来求交集;bitMap的使用得先判定使用场景。

 

2.4 Lucene的评分机制

 

 

3 ElasticSearch

3.1 定位及竞品对比

对比项

优点

缺点

Es

  1. Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。

  2. Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。

  3. 处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。

  4. Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。

  5. 各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。

Elasticsearch 是计算密集型的。官方建议 运行 ES 的机器最好有 64 GB 的内存,强烈反对在低于 8 GB 内存的机器上运行它。Elasticsearch 是一个 内存中 数据库,这样使它的查询速度非常快,但这也非常占用系统内存。在生产系统中使用时,他们强烈建议在一个集群中运行多个 Elasticsearch 节点,以实现高可用、自动分区和一个节点失败时的数据冗余。

Solr

  1. Solr有一个更大、更成熟的用户、开发和贡献者社区。

  2. 支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。

  3. solr比较成熟、稳定。

  4. 不考虑建索引的同时进行搜索,速度更快。

  1. 建立索引时,搜索效率下降,实时索引搜索效率不高。

总结

Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;

Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。总之,Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。

Es耗资源其实不算一种缺点,其实更应该算是一个特性。

 

 

 

3.2 分布式架构设计

在3.1节中,我们也提到Es是自己实现了分布式框架。具体来说,分为两块

  • 节点发现 --> Zen Discovery(基于gossip协议)

  • 一致性算法 --> 自行实现了Raft协议

这两块其实和Consul非常类似,可以参考 

 

3.2.1 Zen Discovery 模块

Es基于Gossip协议来实现了节点发现功能,该模块称之为Zen Discovery模块。

https://cloud.tencent.com/developer/article/1421861

 

3.2.2 分布式架构

主从架构 or p2p架构

经常遇到说Es是p2p的对等架构,也有不少说Es是主从架构的。那么Es到底是主从架构还是P2P架构了?其实这两种说法都对,只是分别是从不同的角度来描述Es的架构。

 

架构图:

 

 

详细说明:

从分布式系统的角度来说,Es与其他分布式不一样的是Es是p2p架构。一般的分布式系统,都是采用主从架构,master用来接受请求,并做请求的解析、任务的划分,子任务结果的收集及聚合汇总操作(worker一般仅仅完成计算任务)。

当然主从架构不一定是分布式计算系统,在普通的集群中,也是广泛使用主从架构

但是Es的任一节点都可以做请求解析,任务划分及调度、汇总聚合这些主节点的操作。从这个角度来说,Es是P2P架构。

什么使用p2p架构,为了解决单点故障问题?几台Master组成一个集群,也能解决单点故障。

 

在Es的语境中也有master的概念,诸多Es节点会选出一个Master(等同于Leader),当一个节点被选举成为 节点时, 它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等。 而主节点并不需要涉及到文档级别的变更和搜索等操作(不承载所有的请求),所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。 任何节点都可以成为主节点。

这个Master的职责是维护集群元数据(集群节点信息),维护索引元数据(创建索引、修改索引、删除索引),

 

而worker节点则可以接受查询任务(分布式完成)。

作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将最终结果返回給客户端。 Elasticsearch 对这一切的管理都是透明的。

所以单纯从架构角度来说,Es其实也是主从架构的,采用了类似raft的协议,至于为啥不用raft协议,说法很多。

 

 

 

3.3 系统通信

Es的系统之间的通信是使用Netty。

基于Netty有没有继续封装??

https://zhuanlan.zhihu.com/p/36940048

 

3.4 文件存储

https://cloud.tencent.com/developer/article/1461826

Es并没有使用外接的分布式文件系统,Es使用的是类似于基于本地文件系统的主从备份机制的文件存储方式。

 

3.5 水平扩容

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_coping_with_failure.html

如何扩容,扩容作用?

 

9 参考资料

https://blog.csdn.net/laoyang360/article/details/52244917

[Es竞品分析]https://youzhixueyuan.com/comparison-of-open-source-search-engine-selection.html

[使用 Docker 和 Elasticsearch 构建一个全文搜索应用程序] https://www.zcfy.cc/article/building-a-full-text-search-app-using-docker-and-elasticsearch

 

0 其他

  1. Lucene是否保留原数据 。 其实就是正排文件,这个文件完整保留。

  2. 构建索引会生成哪些文件? --> 倒排索引(term-> docId)的一个映射;

  3. 这些文件如何存储压缩? docId重新编码、term->docId这种kv结构采用了FST的存储方式

  4. shard的水平迁移过程

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习Elasticsearch,我可以给你一些指导。Elasticsearch是一个开源的分布式搜索分析引擎,主要用于快速、实时地存储、搜索分析大量数据。下面是一些学习Elasticsearch的步骤: 1. 了解基本概念:开始学习Elasticsearch之前,你需要了解一些基本的概念,比如索引(index)、类型(type)、文档(document)、字段(field)等。这将帮助你更好地理解Elasticsearch的工作原理。 2. 安装和配置:根据你的操作系统,你可以从Elasticsearch官方网站下载并安装合适的版本。安装完成后,你需要进行适当的配置,如设置集群名称、分配内存等。 3. 学习REST API:Elasticsearch提供了丰富的REST API,用于与其进行交互。了解如何使用这些API来索引、搜索和删除数据是学习Elasticsearch的重要一步。 4. 索引和搜索数据:学习如何创建索引、添加文档以及执行搜索操作是使用Elasticsearch的关键。掌握查询语法、过滤器、聚合操作等功能可以帮助你更有效地使用Elasticsearch。 5. 数据建模和分析学习如何设计合适的数据模型和映射,以及如何使用Elasticsearch进行数据分析和可视化是提高你的技能的重要一步。 6. 扩展和优化:学习如何在生产环境中扩展和优化Elasticsearch集群是非常重要的。了解如何分片、复制、调优性能等将帮助你更好地管理和维护你的数据。 7. 学习资源:除了官方文档,还有很多优秀的学习资源可供参考,如书籍、教程和在线课程等。利用这些资源可以更系统地学习和掌握Elasticsearch。 希望这些步骤能对你学习Elasticsearch有所帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值