elasticsearch搜索引擎开发实战 pdf,elasticsearch索引结构
目录
发动机的实现结构发动机类的方法:如指数方法的实现:总结
engine的实现结构
弹性搜索对于索引中的数据操作如读写得到等接口都封装在发动机中,同时发动机还封装了索引的读写控制,如流量、错误处理等1000发动机。是离全文搜索引擎最近的一部分。
发动机的实现结构如下所示:
发动机接口有三个实现类,主要逻辑都在国际语言中。
影子引擎之实现了发动机接口的部分读方法,主要用于对于索引的读操作。
鲨鱼引擎在国际语言的基础上实现了恢复方法,它的功能跟国际语言基本相同只是它的恢复过程有区别,不会对超越对数和指数进行快照存储。
发动机类定义了一些指数操作的主要方法和内部类,方法如创建,索引等。内部类如索引,删除等。这些方法的实现是在子类中,这些方法的参数是这些内部类。
Engine类的方法:
公共抽象无效创建(创建创建)抛出引擎异常公共抽象空的索引(索引索引)引发引擎异常公共抽象无效删除(删除删除)抛出引擎异常公共抽象void delete(DeleteByQuery delete)引发引擎异常这些抽象方法都在子类中实现,它们的参数都是一类,这些都是发动机的内部类,这些内部类类似于实体类,没有相关逻辑只是由很多提出申请及得到方法构成。如创造和索引都继承自索引操作,它们所有信息都存储到索引操作的相关田中,索引操作如下所示:
公共静态抽象类索引操作实现操作{私有最终文档映射器文档映射器;私有最终期限用户界面设计(User Interface Design的缩写)私有最终parsed文档文档;私人长版;私有最终版本类型版本类型;私人最终起源起源;私人决赛布尔值可以有重复项;私有最终长开始时间;私有长结束时间………}无论是索引还是创建,相关数据和配置都在文件中,根据文件和文档映射器就能够获取本次操作的所有信息,另外的一些字段如版本,uid都是在类初始化时构建。这样传给实际方法的是一个类,在方法内部根据需求获取到相应的数据
如index方法的实现:
私有void innerIndex(索引索引)抛出io异常{同步(脏锁(索引。uid())){ final long当前版本;版本值版本值=版本映射。getunderlock(索引。uid().bytes());if(版本值==null){当前版本=loadcurrentversionpromindex(索引。uid());} else { if(引擎配置。isenablegcdeletes()amp;ampversion值删除()amp安培(引擎配置
.getThreadPool().estimatedTimeInMillis() - versionValue.time()) > engineConfig.getGcDeletesInMillis()) { currentVersion = Versions.NOT_FOUND; // deleted, and GC } else { currentVersion = versionValue.version(); } } long updatedVersion; long expectedVersion = index.version(); if (index.versionType().isVersionConflictForWrites(currentVersion, expectedVersion)) { if (index.origin() == Operation.Origin.RECOVERY) { return; } else { throw new VersionConflictEngineException(shardId, index.type(), index.id(), currentVersion, expectedVersion); } } updatedVersion = index.versionType().updateVersion(currentVersion, expectedVersion); index.updateVersion(updatedVersion); if (currentVersion == Versions.NOT_FOUND) { // document does not exists, we can optimize for create index.created(true); if (index.docs().size() > 1) { indexWriter.addDocuments(index.docs(), index.analyzer()); } else { indexWriter.addDocument(index.docs().get(0), index.analyzer()); } } else { if (versionValue != null) { index.created(versionValue.delete()); // we have a delete which is not GCed... } if (index.docs().size() > 1) { indexWriter.updateDocuments(index.uid(), index.docs(), index.analyzer());//获取IndexOperation中doc中字段更新索引 } else { indexWriter.updateDocument(index.uid(), index.docs().get(0), index.analyzer()); } } Translog.Location translogLocation = translog.add(new Translog.Index(index));//写translog versionMap.putUnderLock(index.uid().bytes(), new VersionValue(updatedVersion, translogLocation)); indexingService.postIndexUnderLock(index); } }这就是Engine中create、index这些方法的实现方式。后面分析索引过程中会有更加详细说明。Engine中还有获取索引状态(元数据)及索引操作的方法如merge。这些方法也是在子类中调用lucene的相关接口,跟create,index,get很类似。因为没有深入Engine的方法实现,因此这里的分析比较简单,后面的分析会涉及这里面很多方法。
总结
这里只是从结构上对indexEngine进行了简单说明,它里面的方法是es对lucene索引操作方法的封装,只是增加了一下处理方面的逻辑如写translog,异常处理等。它的操作对象是shard,es所有对shard的写操作都是通过Engine来实现,后面的分析会有所体现。
以上就是elasticsearch索引index之engine读写控制结构实现的详细内容,更多关于elasticsearch索引index engine读写控制的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。