elasticsearch索引index之engine讀寫控制結(jié)構(gòu)實現(xiàn)
engine的實現(xiàn)結(jié)構(gòu)
elasticsearch對于索引中的數(shù)據(jù)操作如讀寫get等接口都封裝在engine中,同時engine還封裝了索引的讀寫控制,如流量、錯誤處理等。engine是離lucene最近的一部分。
engine的實現(xiàn)結(jié)構(gòu)如下所示:
engine接口有三個實現(xiàn)類,主要邏輯都在InternalEngine中。
ShadowEngine之實現(xiàn)了engine接口的部分讀方法,主要用于對于索引的讀操作。
shardFSEngine在InternalEngine的基礎(chǔ)上實現(xiàn)了recovery方法,它的功能跟InternalEngine基本相同只是它的recovery過程有區(qū)別,不會對Translog和index進行快照存儲。
Engine類定義了一些index操作的主要方法和內(nèi)部類,方法如create,index等。內(nèi)部類如index,delete等。這些方法的實現(xiàn)是在子類中,這些方法的參數(shù)是這些內(nèi)部類。
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;
這些抽象方法都在子類中實現(xiàn),它們的參數(shù)都是一類,這些都是Engine的內(nèi)部類,這些內(nèi)部類類似于實體類,沒有相關(guān)邏輯只是由很多filed及get方法構(gòu)成。如Create和Index都繼承自IndexOperation,它們所有信息都存儲到IndexOperation的相關(guān)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,相關(guān)數(shù)據(jù)和配置都在doc中,根據(jù)doc和docMapper就能夠獲取本次操作的所有信息,另外的一些字段如version,uid都是在類初始化時構(gòu)建。這樣傳給實際方法的是一個class,在方法內(nèi)部根據(jù)需求獲取到相應(yīng)的數(shù)據(jù)
如index方法的實現(xiàn):
private void innerIndex(Index index) throws IOException { synchronized (dirtyLock(index.uid())) { final long currentVersion; VersionValue versionValue = versionMap.getUnderLock(index.uid().bytes()); 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(index.uid().bytes(), new VersionValue(updatedVersion, translogLocation)); indexingService.postIndexUnderLock(index); } }
這就是Engine中create、index這些方法的實現(xiàn)方式。后面分析索引過程中會有更加詳細(xì)說明。Engine中還有獲取索引狀態(tài)(元數(shù)據(jù))及索引操作的方法如merge。這些方法也是在子類中調(diào)用lucene的相關(guān)接口,跟create,index,get很類似。因為沒有深入Engine的方法實現(xiàn),因此這里的分析比較簡單,后面的分析會涉及這里面很多方法。
總結(jié)
這里只是從結(jié)構(gòu)上對indexEngine進行了簡單說明,它里面的方法是es對lucene索引操作方法的封裝,只是增加了一下處理方面的邏輯如寫translog,異常處理等。它的操作對象是shard,es所有對shard的寫操作都是通過Engine來實現(xiàn),后面的分析會有所體現(xiàn)。
以上就是elasticsearch索引index之engine讀寫控制結(jié)構(gòu)實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于elasticsearch索引index engine讀寫控制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
RestTemplat中關(guān)于getForobject方法的使用
這篇文章主要介紹了RestTemplat中關(guān)于getForobject方法的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Springboot內(nèi)置的工具類之CollectionUtils示例講解
這篇文章主要介紹了Springboot內(nèi)置的工具類之CollectionUtils,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12SpringBoot定時監(jiān)聽RocketMQ的NameServer問題及解決方案
這篇文章主要介紹了SpringBoot定時監(jiān)聽RocketMQ的NameServer問題及解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12Java中的靜態(tài)綁定和動態(tài)綁定詳細(xì)介紹
這篇文章主要介紹了Java中的靜態(tài)綁定和動態(tài)綁定詳細(xì)介紹,在Java中存在兩種綁定方式,一種為靜態(tài)綁定,又稱作早期綁定,另一種就是動態(tài)綁定,亦稱為后期綁定,需要的朋友可以參考下2015-01-01IDEA下使用Spring Boot熱加載的實現(xiàn)
本文主要介紹了IDEA下使用Spring Boot熱加載的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringBoot如何使用TestEntityManager進行JPA集成測試
TestEntityManager是Spring Framework提供的一個測試框架,它可以幫助我們進行 JPA 集成測試,在本文中,我們將介紹如何使用 TestEntityManager 進行 JPA 集成測試,感興趣的跟著小編一起來學(xué)習(xí)吧2023-06-06java設(shè)計模式Ctrl?C和Ctrl?V的原型模式詳解
這篇文章主要為大家介紹了java設(shè)計模式Ctrl?C和Ctrl?V的原型模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02