読者です 読者をやめる 読者になる 読者になる

Elasticsearchのコードを読んでみる② 更新編

プログラミング

備忘録第二だん更新処理

curl -XPUT localhost:9200/testindex/type1/_create -d '{"hogehoge" : "fugafuga"}'
という感じのリクエストをしてインデクスされるまでの更新処理。ざっくり

更新リクエスト処理

RestIndexAction : インデックスリクエストを処理するクラス
- client.index()を実行。めぐりめぐってNodeClient#execute()が実行される。


NodeClient : 各ノード内部のリクエストを実行するクライアントクラス
- TransportIndexAction#execute()を実行。


TransportIndexAction : インデックスリクエストをノード間で処理するクラス
- AutoCreateIndex#shouldAutoCreate()でインデックス作成有無を判定してインデックス作成処理を行う。
- インデックスを作成する場合はTransportCreateIndexAction#execute()を実行。
- ちなみにTransportActionクラスはexecute()のなかからdoExecute()を呼び出すようになっていて、TransportIndexActionなどの子クラスでdoExecute()に個別の処理を実装する感じの作りになっている


TransportCreateIndexAction : インデック生成スリクエストをノード間で処理するクラス
- 自ノードがマスターだったらMetaDataCreateIndexService#createIndex()を実行。
- 自ノードがマスターではなかったらマスターにインデックス生成リクエストを送信。マスターノードはTransportMasterNodeOperationAction.TransportHandlerでリクエストをうけ、リクエストをTransportIndexAction#execute()あたりから処理してMetaDataCreateIndexService#createIndex()が実行される。


MetaDataCreateIndexService : インデックスのメタ情報を設定するクラス
- 対象のIndexクラスやIndexServiceクラスを作成してMappingなどいろいろ設定する。
- アロケーションも行う。
- 一連の処理が完了したあたりでクラスターチェンジイベントを発行。各ノードがハンドルして対象シャードについてMetaDataCreateIndexServiceのcreateIndex()が呼ばれて同様に設定される。
- 成功したらListenerのonResponseを実行してTransportIndexActionまでもどる


TransportIndexAction
- 各シャードごとにドキュメント登録処理を行う。
- まずプライマリーシャードに対してshardOperationOnPrimary()が実行され、そこでInternalIndexShard#index()を実行。
- おわったらレプリカシャードに対してshardOperationOnReplica()が実行され、そこでもInternalIndexShard#index()を実行
- おわったらlistenerにレスポンスを渡す。


InternalIndexShard : シャードのインスタンスクラス
- InternalEngine#index()を実行


InternalEngine : 検索エンジンを操作する感じのクラス?
- LuceneのIndexWriter#addDocuments()を実行する。