jjzjj

ElasticSearch分片与Lucene Index

心雨⁢​⁢⁣ 2024-04-27 原文

        在ES中一个索引有一个或者多个分片构成,在创建索引的时候可以设置主分片和副本分片的数量,当主分片确定之后就不可以再修改了(因为路由需要基于这个数量来分发请求),而副本分片数量随时可以修改

PUT /myIndex
{
   "settings" : {
      "number_of_shards" : 2,    //该索引有2个分片
      "number_of_replicas" : 1   //每个分片都有一个副本
   }
}

        这里我假设说是建立了两个节点,就是起了两个ES服务,shard1跟shard2就是创建的两个主分片,replica1和replica2就是两个副本分片,一般为了实现高可用,ES会将主分片和副本分片保存在不同的NODE节点中,这个动作由ES自动完成。

那么这一个个shard它又是什么呢?

shard = Lucene Index  

        我们知道ElasticSearch是一个分布式可扩展的实时搜索和分析引擎,是一个建立在全文搜索引擎Apache Lucene基础上的搜索引擎。那么Shard本质上就是一个个的Lucene Index。

        在lucene里面由很多小的segment,每个segment内部都有许多中数据结构,比如说经常听说的Inverted Index(倒排索引),Sorted Fields,Document Values...,那么其中最重要的就是倒排索引了。  

Inverted Index(倒排索引)

倒排索引主要包括两部分:

 当我们进行搜索的时候,会将搜索的内容进行分词。然后在字典找到对应的term,从而就可以找到搜索相关的文件内容。

  • 有序数据字典Dictionary(包括单词term和它出现的频率)

  • 与单词对应的Postings(即存在这个单词的文件)

Sorted Fields(字段查找)

当想要查找包含某个特定的标题内容的文档时,就会用到这种结构。本质上它是一个简单的K-V集合,默认会存储整个文档的Json格式。

网图:

Document Values(为了排序、聚合)

它是为了解决排序、聚合而诞生的。这种结构本质上是一个列式的存储。

网图:

 

为了提高效率、ES可以将索引下的某一个Document Vlaue 全部读取到内存中进行操作,以此来提高访问速度,但是会消耗内存空间。

这几种数据结构、Inverted Index、Sorted Fields、Document Values 以及缓存,都在Segment内部。

当搜索时

Lucene会搜索所有的segment,然后将每个segment的搜索结果返回,然后返回给客户端。

缓存

当ES搜索文档的时候,会给文档建立相应的缓存、并且每秒都去刷新缓存。  

segment合并

 随着时间的增加,会有越来越多的segment,es会将这些segment合并,合并之后将原来的删掉,所以就会出现一种情况,你增加了更多的文档,索引占用的空间可能越来越小,因为引起了merge,从而有更多的压缩。

文档索引步骤顺序

新建单个文档所需要的顺序步骤:

网图:

1,客户端向Node1发送新建索引或者删除请求。

2,节点使用文档的_id确定文档属于那个分片。请求会被转发到对应的Node。

3,在分片上面执行请求。如果执行成功了,那么请求会被转发到各个节点的副本分片上,如果都成功了,那么就会返回给客户端成功的信息。

整体流程,依然是妄(网)图。。。

 

1,请求发送后会先来到协调节点,默认使用文档的id计算出来由哪一个分片来处理请求。

shard=hash(_id)%分片数量

2,分片接受到请求后,会先将请求写道memory buffer,然后定时(默认1s)写入到Filesystem。从memory buffer 到Filesystem cache的过程就叫refresh。

3,Transaction Log是用来保证数据可靠性的,因为refresh过程数据是有可能数据丢失的。在shard接受到请求后,同时会把请求写入translog中,当Filesystem cache中的数据写入到磁盘中后,才会被清除掉,这个过程教flush。

4,在flush过程中,内存中的缓存将会被清除,内容被写入一个新的段,段的fsync将会创建一个新的提交点,并将内容刷新到磁盘,旧的translog将被删除并开始一个新的trabslog。flush的触发机制默认30分钟,或者translog太大。

 

有关ElasticSearch分片与Lucene Index的更多相关文章

  1. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  2. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  3. ruby-on-rails - 使用 Rails (Tire) 和 ElasticSearch 进行模糊字符串匹配 - 2

    我有一个Rails应用程序,现在设置了ElasticSearch和Tiregem以在模型上进行搜索,我想知道我应该如何设置我的应用程序以对模型中的某些索引进行模糊字符串匹配。我将我的模型设置为索引标题、描述等内容,但我想对其中一些进行模糊字符串匹配,但我不确定在何处进行此操作。如果您想发表评论,我将在下面包含我的代码!谢谢!在Controller中:defsearch@resource=Resource.search(params[:q],:page=>(params[:page]||1),:per_page=>15,load:true)end在模型中:classResource'Us

  4. 美团外卖搜索基于Elasticsearch的优化实践 - 2

    美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此

  5. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  6. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  7. ruby-on-rails - Elasticsearch 问题 : Cannot connect AWS elasticsearch service - 2

    我有一个关于配置elasticsearch以连接AWSelasticsearch服务以在生产环境中运行项目的问题。我的gem文件:gem'searchkick'gem'faraday_middleware-aws-signers-v4'gem'aws-sdk','~>2'gem"elasticsearch",">=1.0.15"引用:https://github.com/ankane/searchkick我的config/initializers/elasticsearch.rb文件:require"faraday_middleware/aws_signers_v4"ENV["ELAS

  8. linux查看es节点使用情况,elasticsearch(es) 如何查看当前集群中哪个节点是主节点(master) - 2

    elasticsearch查看当前集群中的master节点是哪个需要使用_cat监控命令,具体如下。查看方法es主节点确定命令,以kibana上查看示例如下:GET_cat/nodesv返回结果示例如下:ipheap.percentram.percentcpuload_1mload_5mload_15mnode.rolemastername172.16.16.188529952.591.701.45mdi-elastic3172.16.16.187329950.990.991.19mdi-elastic2172.16.16.231699940.871.001.03mdi-elastic4172

  9. ruby - 在 Elasticsearch 中计算地理距离 - 2

    我在查询中使用geo_distancefilter和tire,它工作正常:search.filter:geo_distance,:distance=>"#{request.distance}km",:location=>"#{request.lat},#{request.lng}"我预计结果会以某种方式包括到我用于过滤器的地理位置的计算距离。有没有办法告诉elasticsearch在响应中包含它,这样我就不必在ruby​​中为每个结果计算它?==更新==我在谷歌群组中的foundtheanswer:search.sortdoby"_geo_distance","location"=>"

  10. ruby - 有没有办法计算 ElasticSearch 或 Tire 中索引的所有元素? - 2

    如果不必像这样进行搜索就可以对元素进行计数,那就太好了Obj.search("id:*").count这可能吗? 最佳答案 在ElasticSearch中,您可以使用计数API对所有元素进行计数curl-XGEThttp://localhost:9200/index/_count参见CountAPI他们网站上的文档。 关于ruby-有没有办法计算ElasticSearch或Tire中索引的所有元素?,我们在StackOverflow上找到一个类似的问题: ht

随机推荐