Elasticsearch介绍

目录

一.Elasticsearch名词解释

二.Elasticsearch集群

三.分片

四.在分布式系统中深度分页问题.

五.分析和分析器

六.ES准实时文档


一.Elasticsearch名词解释

1.索引:

如前所述,一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。 索引 (index) 的复数词为 indices 或 indexes 。

2.映射:

就像数据库中的表有哪些字段,描述了文档可能具有的字段或 属性 、每个字段的数据类型—比如 string, integer 或 date —以及Lucene是如何索引和存储这些字段的。也可以自定义映射关系.

3.类型:

相当于传统关系数据库中的一张表,Elasticsearch 公开了一个称为 types (类型)的特性,它允许您在索引中对数据进行逻辑分区。不同 types 的文档可能有不同的字段

4.文档

①相当于数据库表中的每一行数据,在 Elasticsearch 中每个文档都有一个版本号。当每次对文档进行修改时(包括删除), _version 的值会递增,主要是用来控制并发修改时候出现事务问题(乐观解决事务)

②当更新文档的时候首先查询出文档,文档里面有版本号,当根据次版本号去更新数据的时候,结果版本号已经增加,修改过了,就会返回错误.

③可以批量更新文档

④在内部,Elasticsearch 已将旧文档标记为已删除,并增加一个全新的文档。 尽管你不能再对旧版本的文档进行访问,但它并不会立即消失。当继续索引更多的数据,Elasticsearch 会在后台清理这些已删除文档。

⑤删除文档和更新文档一样,不会立刻删除

⑥搜索文档可以再多个索引里面搜索,也可以全部索引搜索.

二.Elasticsearch集群

1.当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。

2.主节点作用:

它将负责管理集群范围内的所有变更,例如增加、删除索引,或者增加、删除节点等.而主节点并不需要涉及到文档级别的变更和搜索等操作.任何节点都可以成为主节点。

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

4.当一个搜索请求被发送到某个节点时,这个节点就变成了协调节点。 这个节点的任务是广播查询请求到所有相关分片并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户端

5.当一个主节点出现故障关闭的时候,而集群必须拥有一个主节点来保证正常工作,所以发生的第一件事情就是选举一个新的主节点,选取新的主节点后,集群立马就可以开始正常工作了.

6.一个节点既可以是候选主节点也可以是数据节点,但是由于数据节点对 CPU、内存核 I/O 消耗都很大。所以如果某个节点既是数据节点又是主节点,那么可能会对主节点产生影响从而对整个集群的状态产生影响。

因此为了提高集群的健康性,我们应该对 Elasticsearch 集群中的节点做好角色上的划分和隔离。可以使用几个配置较低的机器群作为候选主节点群。

主节点和其他节点之间通过 Ping 的方式互检查,主节点负责 Ping 所有其他节点,判断是否有节点已经挂掉。其他节点也通过 Ping 的方式判断主节点是否处于可用状态

7.脑裂现象: 集群间的网络延迟导致一些节点访问不到 Master,认为 Master 挂掉了从而选举出新的 Master,并对 Master 上的分片和副本标红,分配新的主分片。

防止措施:

①适当调大节点状态响应时间,减少误判

②配置选举master节点的节点数,可以配置2/3个(多数原则)候选节点数量,这样就可以尽量防止.

③角色分离,把候选节点和数据节点分开,防止候选节点因为数据量过大假死

三.分片

1.一个分片是一个 Lucene 的实例,以及它本身就是一个完整的搜索引擎

2.Elasticsearch 是利用分片将数据分发到集群内各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。 当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里

3.一个分片可以是分片或者副本分片.索引内任意一个文档都归属于一个主分片

4.一个副本分片只是一个主分片的拷贝.副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

5.在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。实际上,这个数目定义了这个索引能够 存储 的最大数据量。(实际大小取决于你的数据、硬件和使用场景。) 但是,读操作——搜索和返回数据——可以同时被主分片 副本分片所处理,所以当你拥有越多的副本分片时,也将拥有越高的吞吐量。

6.同一份数据的主分片和副分片不是在一个节点的,简单来说不是在同一台机器的,因为副本分片是冗余的备份,放在一个节点是没有意义的

7.当我们搭建单实例的Elasticsearch的时候可以看到运行状态是黄色的是因为,没有副本分片,没有备份数据,数据有丢失的风险.

8.新建、索引和删除请求都是操作,必须在主分片上面完成之后才能被复制到相关的副本分片,当主分片把更改转发到副本分片时,它不会转发更新请求.相反,它转发完整文档的新版本。请记住,这些更改将会异步转发到副本分片,并且不能保证它们以发送它们相同的顺序到达。 如果Elasticsearch仅转发更改请求,则可能以错误的顺序应用更改,导致得到损坏的文档。

9.ES 为了提高写入的能力这个过程是并发写的,同时为了解决并发写的过程中数据冲突的问题,ES 通过乐观锁的方式控制,每个文档都有一个 _version (版本)号,当文档被修改时版本号递增。

10.总结:

对文档写操作,都要先要经过主分片,再复制到副分片,才算成功,读操作可以从主分片或者副分片读取都可以

四.在分布式系统中深度分页问题.

理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 50 个结果排序得到全部结果的前 10 个。

现在假设我们请求第 1000 页—​结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。

可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因

游标分页查询: 查询的时候快照数据,不是实时数据,下次查询的时候需要上次查询的游标id查询

五.分析和分析器

分析 包含下面的过程:

  • 首先,将一块文本分成适合于倒排索引的独立的词条
  • 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall

分析器执行上面的工作。 分析器 实际上是将三个功能封装到了一个包里:

字符过滤器

首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and

分词器

其次,字符串被 分词器 分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。

Token 过滤器

最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 aandthe 等无用词),或者增加词条(例如,像 jumpleap 这种同义词)。

中文分析器最常用的又 ik分词器

六.ES准实时文档

Lucene正常是每次段数据提交到磁盘的时候数据才可见,但是他也允许新段被写入和打开—​使其包含的文档在未进行一次完整提交时便对搜索可见。 这种方式比进行一次提交代价要小得多,并且在不影响性能的前提下可以被频繁地执行

所以ES利用了他第二个特性,默认每秒钟刷新一次数据,数据是秒级可见的

七.ES的优化

1.每个文档指定压缩良好的id,不要使用uuid,压缩比很低

2.如果对实时性要求没那么高,可以调长刷新到磁盘的时间

3.如果不需要分词,可以用keyword类型

4.非常依赖文件系统缓存,需要预留出内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值