首页 > 编程知识 正文

es240(elastic什么意思)

时间:2023-05-04 09:55:34 阅读:95047 作者:4201

注:本文为转载,并在此基础上进行了修改。 3359 Juejin.im /开机自检/5d 551 C1 E 51882529 FA 61 FB 53

什么是电子搜索? Elasticsearch是基于ApacheLucene(TM )的开源搜索引擎。

露西是什么? 无论是开源还是专有,Lucene都被认为是迄今为止最先进、性能最高、功能最强的搜索引擎库,通过简单的rest风格的API隐藏Lucene的复杂性,可以简化全文搜索

除了Lucene和全文检索外,Elasticsearch还可以解释如下。

每个字段都被索引,可搜索的分布式实时分析搜索引擎可以扩展到数百台服务器,处理Pb级结构化或非结构化数据2、Elasticsearch Lucene之间的关系

就像许多业务系统基于Spring实现一样,Elasticsearch和Lucene的关系很简单。 Elasticsearch基于Lucene实现。 ES基于这些底层包进行了扩展,提供了更丰富的查询语句,并使用rest风格的API简化了与底层的交互。 类似于ES和Solr的东西也是基于Lucene实现的。

在APP开发中,使用Elasticsearch会变得简单。 但是,直接使用Lucene的话,会有大量的整合工作。

因此,进入ES的学生只要稍微了解Lucene就可以了。 要想进入高级,还是需要学习Lucene的基础原理。 因为倒排索引、评分机制、全文检索原理、分词原理等,这些都是不会过时的技术。

三、新文档的写入过程

3.1数据模型

在一个es索引(索引,例如商品检索索引、订单检索索引)集群下,构成了多个节点) )节点。 每个节点都是ES的实例。 在各节点中有多个shard (瓦片),P1 P2是主控瓦片R1 R2是复制瓦片,各瓦片中统称为一个Lucene Index ) Lucene Index。 由多个段文件(即倒排索引)组成。 每个段文件都存储有一个Doc文档。

3.2 Lucene索引

虽然Shard实际上是Lucene的“实例”(Lucene Index ),但大多数情况下,一个电子索引由多个shard (shard )主复制(PrimaryReplica )组成。

从文件系统来看,一个Lucene Index是存储一系列文件的目录。 一个Lucene索引由许多独立的segments组成,segments包含文档中的词汇词典、词汇词典的倒排索引和文档的字段数据(在Stored.YES中设置的字段),所有

Segments

Segment直接提供了搜索功能。 ES的单个shard(Luceneindex )包含大量的Segment文件,每个fresh都会生成新的Segment文件,因此Segment文件大、小、零碎。 在ES内部,打开将小段合并到大段的线程,减少碎片,减少文件打开次数,提高I/O性能。

无法修改Segment文件。 更新文档时,实际上是将旧文档标记为删除,然后为新文档建立索引。 在合并过程中删除旧文档。 具体地说,在文件系统中,文档a写入_segment_name.cfs文件,删除文档a时,实际上在_segment_name.del文件中删除文档

,是为逻辑删除。当归并(Merge)的时候,老的 segment 文件将会被删除,合并成新的 segment 文件,这个时候也就是物理删除了。

3.3 新文档写入流程

新文档创建或者更新时,进行如下流程:

更新不会修改原来的 segment,更新和创建操作都会生成新的一个 segment。数据哪里来呢?先会存在内存的 buffer 中,然后持久化到 segment 。

数据持久化步骤如下:write -> refresh -> flush -> merge

3.3.1 write 过程

一个新文档过来,会存储在 in-memory buffer 内存缓存区中,顺便会记录 Translog。

这时候数据还没到 segment ,是搜不到这个新文档的。数据只有被 refresh 后,才可以被搜索到。那么 讲下 refresh 过程.

默认情况下每隔30s 会将 FS cache中的 index 以及 Transaction Log 一并写入磁盘中,当然为了降低数据丢失的概率,可以将这个时间缩短,甚至设置成同步的形式。

删除: 每个段中维护一个.del 文件,ES 只是逻辑删除文档,在.del 文件中标记为已删除,查询依然可以查到,但是会在结果中过滤掉;

更新:引入版本的概念,旧版本的记录将在 .del 文件中标记为删除,新版本的文档将被索引到一个新段(Segment).

TransLog (即所谓的写前日志WAL,Write Ahead Log), 本身是写入到 FS cache 的,什么时候 fsync 到磁盘取决于数据能接受丢失的程度。换句话说,如果需要 ES 具备十分强悍的写入能力,数据丢了一部分也没太大关系,这种情况你可以将 fsync 设置为异步执行的,并且把 fsync 的时间间隔设置的很长;如果你需要非常严谨的数据,不能够接受丢失数据,那么你可能在每次写入 TransLog 的时候都要 fsync 一次(这是默认机制)。然而业务并非总是这么理想化,现实中同样需要在可用性与一致性两者之间做权衡。

3.3.2 refresh 过程

refresh 默认 1 秒钟,执行一次上图流程。ES 是支持修改这个值的,通过 index.refresh_interval 设置 refresh (冲刷)间隔时间。refresh 流程大致如下:

in-memory buffer 中的文档写入到新的 segment 中,但 segment 是存储在文件系统的缓存中。此时文档可以被搜索到最后清空 in-memory buffer。注意: Translog 没有被清空,为了将 segment 数据写到磁盘

文档经过 refresh 后, segment 暂时写到文件系统缓存,这样避免了性能 IO 操作,又可以使文档搜索到。refresh 默认 1 秒执行一次,性能损耗太大。一般建议稍微延长这个 refresh 时间间隔,比如 5 s。因此,ES 其实就是准实时,达不到真正的实时。

3.3.3 flush 过程

上个过程中 segment 在文件系统缓存中,会有意外故障文档丢失。那么,为了保证文档不会丢失,需要将文档写入磁盘。那么文档从文件系统缓存写入磁盘的过程就是 flush。写入磁盘后,清空translog

translog 作用很大:

保证文件缓存中的文档不丢失系统重启时,从 translog 中恢复新的 segment 收录到 commit point 中

具体可以看官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-flush.html

3.3.4 merge 过程

上面几个步骤,可见 segment 会越来越多,那么搜索会越来越慢,怎么处理呢?

通过 merge 过程解决:

就是各个小段文件,合并成一个大段文件。段合并过程段合并结束,旧的小段文件会被删除.liv 文件维护的删除文档,会通过这个过程进行清除

四、小结

如这个图,ES 写入原理不难,记住关键点即可。

write -> refresh -> flush

write:文档数据到内存缓存,并存到 translogrefresh:内存缓存中的文档数据,到文件缓存中的 segment 。此时可以被搜到flush 是缓存中的 segment 文档数据写入到磁盘

写入的原理告诉我们,考虑的点很多:性能、数据不丢失等等。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。