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()を実行する。