`

Elasticsearch源码分析之二------索引过程源码概要分析

阅读更多

Elasticsearch源码分析之二------索引过程源码概要分析

 

 

索引逻辑简单分析,这里只是理清主要的脉络,一些细节方面以后的文章或会阐述。
 
假如通过java api来调用es的索引接口,先是构造成一个json串(es里表示为XContent,是对要处理的内容进行抽象),在IndexRequest里面指定要索引文档到那个索引库(index)、其类型(type)还有文档的id,如果没有指定文档的id,es会通过UUID工具自动生成一个uuid,代码在IndexRequest的process方法内。
[java] view plaincopy
 
 
  1. if (allowIdGeneration) {  
  2.      if (id == null) {  
  3.          id(UUID.randomBase64UUID());  
  4.          opType(IndexRequest.OpType.CREATE);  
  5.      }  
  6.  }  
然后使用封装过netty的TransportService通过tcp协议发送请求到es服务器(rest的话就是通过http协议)。
 
服务器获得TransportAction后解析索引请求(TransportShardReplicationOperationAction)。到AsyncShardOperationAction.start()方法开始进行分片操作,先读取集群状态,把目标索引及其分片信息提取出来,根据索引数据的id、类型以及索引分片信息进行哈希取模,确定把该条数据分配到那个分片。
[java] view plaincopy
 
 
  1. private int shardId(ClusterState clusterState, String index, String type, @Nullable String id, @Nullable String routing) {  
  2.      if (routing == null) {  
  3.          if (!useType) {  
  4.              return Math.abs(hash(id) % indexMetaData(clusterState, index).numberOfShards());  
  5.          } else {  
  6.              return Math.abs(hash(type, id) % indexMetaData(clusterState, index).numberOfShards());  
  7.          }  
  8.      }  
  9.      return Math.abs(hash(routing) % indexMetaData(clusterState, index).numberOfShards());  
  10.  }  
 
并找到数据要分配到的分片的主分片,先把索引请求提交到主分片处理(TransportIndexAction.shardOperationOnPrimary)。
 
判断是否必须要指定routing值
[java] view plaincopy
 
 
  1. MappingMetaData mappingMd = clusterState.metaData().index(request.index()).mappingOrDefault(request.type());  
  2.   if (mappingMd != null && mappingMd.routing().required()) {  
  3.       if (request.routing() == null) {  
  4.           throw new RoutingMissingException(request.index(), request.type(), request.id());  
  5.       }  
  6.   }  
 
判断索引操作的类型,索引操作有两种,一种是INDEX,当要索引的文档id已经存在时,不会覆盖原来的文档,只是更新原来文档。一种是CREATE,当索引文档id存在时,会抛出该文档已存在的错误。
[java] view plaincopy
 
 
  1. if (request.opType() == IndexRequest.OpType.INDEX)   
调用InternalIndexShard进行索引操作
[java] view plaincopy
 
 
  1. Engine.Index index = indexShard.prepareIndex(sourceToParse)  
  2.         .version(request.version())  
  3.         .versionType(request.versionType())  
  4.         .origin(Engine.Operation.Origin.PRIMARY);  
  5. indexShard.index(index);  
通过(InternalIndexShard)查找与请求索引数据类型(type)相符的mapping。对要索引的json字符串进行解析,根据mapping转换为对应的解析结果ParsedDocument 。
[java] view plaincopy
 
 
  1. public Engine.Index prepareIndex(SourceToParse source) throws ElasticSearchException {  
  2.     long startTime = System.nanoTime();  
  3.     DocumentMapper docMapper = mapperService.documentMapperWithAutoCreate(source.type());  
  4.     ParsedDocument doc = docMapper.parse(source);  
  5.     return new Engine.Index(docMapper, docMapper.uidMapper().term(doc.uid()), doc).startTime(startTime);  
  6. }  
最后调用RobinEngine中的相关方法(添加或修改)对底层lucene进行操作,这里是写入到lucene的内存索引中(RobinEngine.innerIndex)。
[java] view plaincopy
 
 
  1. if (currentVersion == -1) {  
  2.        // document does not exists, we can optimize for create  
  3.        if (index.docs().size() > 1) {  
  4.            writer.addDocuments(index.docs(), index.analyzer());  
  5.        } else {  
  6.            writer.addDocument(index.docs().get(0), index.analyzer());  
  7.        }  
  8.    } else {  
  9.        if (index.docs().size() > 1) {  
  10.            writer.updateDocuments(index.uid(), index.docs(), index.analyzer());  
  11.        } else {  
  12.            writer.updateDocument(index.uid(), index.docs().get(0), index.analyzer());  
  13.        }  
  14.    }  
写入内存索引后还会写入到Translog(Translog是对索引的操作日志,会记录没有持久化的操作)中,防止flush前断电导致索引数据丢失。
[java] view plaincopy
 
 
  1. Translog.Location translogLocation = translog.add(new Translog.Create(create));  
主分片索引请求完就把请求发给副本进行索引操作。最后把成功信息返回给客户端。
分享到:
评论

相关推荐

    elasticsearch-analysis-ik-7.15.2和7.14.0.zip

    Elasticsearch 分析插件 "analysis-ik" 是一个针对中文分词的高效工具,尤其在处理中文文本的搜索引擎优化方面表现出色。该插件的主要目的是为了更好地支持中文的全文检索,通过细致的分词处理,提高搜索结果的...

    elasticsearch-analysis-dynamic-synonym-7.2.0

    Elasticsearch(ES)是一款功能强大的全文搜索引擎,广泛应用于数据检索、数据分析等领域。为了提高搜索的准确性和便利性,Elasticsearch提供了丰富的分析插件,其中"elasticsearch-analysis-dynamic-synonym-7.2.0...

    elasticsearch-analysis-ik-7.10.0.zip下载

    在使用过程中,可以通过Elasticsearch的配置文件(如elasticsearch.yml)设置分词器参数,或者在创建索引时指定分词器类型。 总的来说,"elasticsearch-analysis-ik-7.10.0.zip"是Elasticsearch 7.10.0版的一个关键...

    elasticsearch-analysis-pinyin-7.4.0 es拼音分词器7.4.0

    Elasticsearch(简称ES)是一款强大的开源搜索引擎,广泛应用于大数据领域的全文检索。它以其高可扩展性、实时性能以及丰富的分析能力著称。在中文环境下,由于汉字的复杂性,分词是实现有效搜索的关键步骤。为此,...

    最新版elasticsearch-analysis-ik-8.8.2.zip

    最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip最新版elasticsearch-analysis-ik-8.8.2.zip

    elasticsearch-analysis-ik-8.11.0

    Elasticsearch Analysis IK 8.11.0 是一个专为Elasticsearch 8.11.0版本设计的中文分词插件,其主要目标是提供对中文文本的高效、精确的分词能力,以提升搜索引擎的索引质量和查询效果。这个插件分为粗粒度和细粒度...

    elasticsearch-bulk-insert-plugin-8.x-es7.x.x.zip

    kettle 支持elasticsearch7.x 批量上传的插件,减压后放到data-integration\plugins 目录下即可

    elasticsearch-analysis-ik-7.16.2.zip

    《Elasticsearch分词器:elasticsearch-analysis-ik-7.16.2深度解析》 在信息爆炸的时代,搜索引擎的效能成为了数据检索的关键。Elasticsearch作为一款强大的开源搜索引擎,其灵活性和可扩展性备受青睐。而在中文...

    elasticsearch-analysis-pinyin-7.10.1 elasticsearch-analysis-ik-7

    Elasticsearch是一个强大的开源搜索引擎,广泛应用于大数据分析和实时数据检索。在中文处理方面,它需要依赖特定的分词插件来对文本进行有效的索引和搜索。在给定的标题和描述中,提到了两个重要的插件:"elastic...

    最新版 elasticsearch-analysis-ik-8.7.0.zip

    最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip最新版 elasticsearch-analysis-ik-8.7.0.zip

    elasticsearch-analysis-dynamic-synonym-7.0.0.zip

    Elasticsearch是一个强大的开源搜索引擎,广泛应用于数据存储和分析领域。为了增强其对文本的处理能力,特别是中文分词和语义理解,开发者通常会利用各种插件来扩展其功能。"elasticsearch-analysis-dynamic-synonym...

    elasticsearch-analysis-ik-7.10.2.zip

    Elasticsearch(ES)作为一个开源的全文搜索引擎,因其强大的搜索功能和分布式特性而备受青睐。然而,对于中文这种复杂的语言,分词是搜索引擎理解文本的关键步骤。本文将详细介绍elasticsearch-analysis-ik-7.10.2...

    最新版 elasticsearch-analysis-ik-7.6.2.zip

    Elasticsearch 是一款高度可扩展的开源全文搜索引擎,它提供了实时、分布式的搜索和分析功能。在处理中文文档时,我们需要一个能够理解中文语言的分词器,这就是IK(Intelligent Chinese)分析器的用武之地。...

    elasticsearch-analysis-ik-7.16.3.zip

    在现代大数据分析和搜索引擎领域,Elasticsearch(ES)因其高效、灵活的全文检索能力而备受青睐。然而,对于中文这样的多字节语言,如何准确地进行分词是关键。这时,我们就需要引入专门的中文分词器。本文将详细...

    elasticsearch-analysis-ik-7.17.0

    IK(IntelligentKeyword)分析器是Elasticsearch社区中最成熟的中文分词插件之一,它的目标是为Elasticsearch提供更智能的中文分词能力。版本7.17.0代表了该插件对Elasticsearch 7.17.0版本的适配,确保与核心引擎的...

    elasticsearch-analysis-ik-7.3.2.zip

    "elasticsearch-analysis-ik"是ES中最受欢迎的中文分词器之一,专为提升中文文本分析性能而设计。本文将深入探讨"elasticsearch-analysis-ik-7.3.2"这个版本,以及与其相关的技术细节。 首先,"elasticsearch-...

    elasticsearch-analysis-ik-7.4.2.zip.7z

    elasticsearch-analysis-ik就是这样一个插件,它是针对Elasticsearch的最流行的中文分词器之一,旨在提供高效、准确的中文分词服务。 elasticsearch-analysis-ik插件由IK Analyzer团队开发,IK即...

    elasticsearch-bulk-insert-plugin.zip

    Elasticsearch-Bulk-Insert-Plugin 是一个专为Kettle设计的插件,主要用于高效地将大量数据批量插入到Elasticsearch(ES)集群中。Elasticsearch是一种流行且功能强大的分布式搜索引擎,常用于大数据分析、日志分析...

    elasticsearch-head-chrome-master.zip

    **Elasticsearch Head 插件详解** Elasticsearch Head 是一个非常实用的开源工具,用于可视化管理和监控 Elasticsearch 集群。在这个“elasticsearch-head-chrome-master.zip”压缩包中,我们得到了 Chrome 浏览器...

    elasticsearch-analysis-dynamic-synonym-7.6.2

    Elasticsearch(ES)作为一款强大的全文搜索引擎,同样支持对同义词的处理。`elasticsearch-analysis-dynamic-synonym-7.6.2`是一个专为ES7.6.2版本设计的动态同义词插件,旨在实现同义词的动态加载和管理,使得同义...

Global site tag (gtag.js) - Google Analytics