elasticsearch索引index之engine读写控制结构实现-mile米乐体育
目录
- engine的实现结构
- engine类的方法:
- 如index方法的实现:
- 总结
engine的实现结构
elasticsearch对于索引中的数据操作如读写get等接口都封装在engine中,同时engine还封装了索引的读写控制,如流量、错误处理等。engine是离lucene最近的一部分。
engine的实现结构如下所示:
engine接口有三个实现类,主要逻辑都在internalengine中。
shadowengine之实现了engine接口的部分读方法,主要用于对于索引的读操作。
shardfsengine在internalengine的基础上实现了recovery方法,它的功能跟internalengine基本相同只是它的recovery过程有区别,不会对translog和index进行快照存储。
engine类定义了一些index操作的主要方法和内部类,方法如create,index等。内部类如index,delete等。这些方法的实现是在子类中,这些方法的参数是这些内部类。
engine类的方法:
public abstract void create(create create) throws engineexception; public abstract void index(index index) throws engineexception; public abstract void delete(delete delete) throws engineexception; public abstract void delete(deletebyquery delete) throws engineexception;
这些抽象方法都在子类中实现,它们的参数都是一类,这些都是engine的内部类,这些内部类类似于实体类,没有相关逻辑只是由很多filed及get方法构成。如create和index都继承自indexoperation,它们所有信息都存储到indexoperation的相关field中,indexoperation如下所示:
public static abstract class indexingoperation implements operation { private final documentmapper docmapper; private final term uid; private final parseddocument doc; private long version; private final versiontype versiontype; private final origin origin; private final boolean canhaveduplicates; private final long starttime; private long endtime; ……………… }
无论是index还是create,相关数据和配置都在doc中,根据doc和docmapper就能够获取本次操作的所有信息,另外的一些字段如version,uid都是在类初始化时构建。这样传给实际方法的是一个class,在方法内部根据需求获取到相应的数据
如index方法的实现:
private void innerindex(index index) throws ioexception { synchronized (dirtylock(index.uid())) { final long currentversion; versionvalue versionvalue = versionmap.getunderlock(index.uid().bytes()); ooaudxl if (versionvalue == null) { currentversion = loadcurrentversionfromindex(index.uid()); } else { if (engineconfig.isenablegcdeletes() && versionvalue.delete() && (engineconfig.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 gc'ed... } 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(inooaudxldex.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读写控制的资料请关注mile米乐体育其它相关文章!