ESには知っておくべきことがあります
1.それはなんですか?
Elasticsearchは、リアルタイムの分散ストレージ、検索、分析エンジンと強力なファジー/関連照会。
2.データ構造?
用語辞書:テキストの段落を入力すると、Elasticsearchはトークナイザー(つまり、図に示すようにAda / Allen / Sara ...)に従ってテキストをセグメント化します。これらのサブワードはまとめてTerm Dictionary
。と呼ばれます。ではTerm Dictionary
、私たちはその言葉の中になりますので、それは、非常に、非常に多くあるので、ソート、およびので、あなたがでできたときに見つけたい半分確認するために、全体を横断する必要はありません。Term Dictionary
用語インデックス:Term Dictionary
単語が多すぎるため、Term Dictionary
すべての単語をメモリに配置できないため、Elasticsearchもスモークレイヤーが呼び出されますTerm Index
。このレイヤーは部分的にのみ保存された単語プレフィックスであり、Term Index
メモリに保存されます(特に高速取得が行われます)。Term Index
これは、FST(Finite State Transducers)の形式でメモリに格納されます。これは、非常にメモリを節約することを特徴としています。
投稿:ドキュメントIDが保存されPostingList
、内部のデータはPostingList
フレームオブリファレンス(FOR)エンコーディングテクノロジーを使用して圧縮され、ディスクスペースを節約します。
有限状態トランスデューサー:(追加予定)
参照フレーム:(追加予定)
3. ESの一般的な用語は?
インデックス:Elasticsearchのインデックスはデータベースのテーブルに相当します
タイプ:これは新しいElasticsearchバージョンで廃止されました(以前のElasticsearchバージョンでは、1つのインデックスで複数のタイプがサポートされています-メッセージキューの1つのトピックの下にある複数のグループの概念に多少似ています)
ドキュメント:ドキュメントは、データベース内のレコードの行に相当します
フィールド:データベースの列に相当する概念
マッピング:データベースのスキーマに相当する概念
DSL:データベースと同等のSQL(Elasticsearchデータを読み取るためのAPI)
4.ES全体のアーキテクチャ
ESアーキテクチャ(分散型、高可用性)
ES書き込み
クラスター上の各ノードはcoordinating node
(調整ノード)であり、調整ノードは、このノードがルーティングを実行できることを示します。たとえば、ノード1はリクエストを受信しますが、このリクエストのデータはノード2で処理する必要があることを検出したため(メインシャードはノード2にあるため)、ノード2にリクエストを転送します。
coodinate(調整)ノードは、ハッシュアルゴリズムを介して、どのメインシャード上にあるかを計算し、対応するノードにルーティングできます。 shard = hash(document_id) % (num_of_primary_shards)
メインシャード書き込みプロセス
-
メモリバッファにデータを書き込む
-
次に、データをトランスログバッファに書き込みます
-
1秒ごとにデータがバッファからFileSystemCacheに更新され、セグメントファイルが生成されます。セグメントファイルが生成されると、インデックスを介してクエリを実行できます。
-
リフレッシュ後、メモリバッファは空になります。
-
5秒ごとに、トランスログはバッファからディスクにフラッシュします
-
FileSystemCacheから定期的/定量的に、トランスログコンテンツ
flush index
をディスクに結合します。
- Elasticsearchは、最初にデータをメモリバッファに書き込み、次に1秒ごとにファイルシステムキャッシュに更新します(データは、データがファイルシステムバッファにフラッシュされた後にのみ取得できます)。したがって、Elasticsearchによって書き込まれたデータのクエリには1秒かかります
- ノードのダウンタイムとメモリ内のデータ損失を防ぐために、Elasticsearchはデータの別のコピーをログファイルに書き込みますが、初期データはメモリバッファに書き込まれ、バッファは5秒ごとにディスクにフラッシュされます。したがって、Elasticsearchのノードがダウンすると、5秒のデータが失われる可能性があります。
- ディスク上のトランスログファイルが十分に大きいか、30分を超えると、コミット操作がトリガーされ、メモリ内のセグメントファイルがディスクに非同期的にフラッシュされて永続化操作が完了します。
メインシャードが書き込まれた後、データはレプリカセットノードに並行して送信され、すべてのノードが正常に書き込まれると、ackは調整ノードに返され、調整ノードはackをクライアントに返して1回の書き込みを完了します。 。
ESの更新/削除
Elasticsearchの更新および削除操作プロセス:対応するdoc
レコードをマークし.del
、削除操作のdelete
場合doc
はステータスをマークし、更新操作の場合は元のレコードをとしてマークしてdelete
から、新しいデータを書き込みます
前述のように、セグメントファイルは1秒ごとに生成され、セグメントファイルはますます増えます。Elasticsearchにはマージタスクがあり、より多くのセグメントファイルが1つのファイルセグメントにマージされます。
マージの過程で、物理的なdelete
状態が削除されます。doc
ESクエリ
私たちに問い合わせる最も簡単な方法は、2つのタイプに分けることができます。
- IDに基づいてドキュメントを照会する
- クエリ(検索用語)に従って、一致するドキュメントをクエリします
IDに基づいて特定のドキュメントをクエリするプロセスは次のとおりです。
- メモリ内のトランスログファイルを取得する
- ハードディスクからTranslogファイルを取得します
- ハードディスクからセグメントファイルを取得する
クエリに従ってドキュメントを照合するプロセスは次のとおりです。
- 同時に、メモリとハードディスクのセグメントファイルをクエリします
上記の書き込みプロセスから、次のことがわかります。Get(IDによるドキュメントのチェックはリアルタイム)、Query(クエリによるドキュメントのマッチングはほぼリアルタイム)
セグメントファイルは毎秒生成されるため
Elasticsearchクエリは、次の3つの段階に分けることができます。
- QUERY_AND_FETCH(クエリの完了後にドキュメントコンテンツ全体を返します)
- QUERY_THEN_FETCH(最初に対応するドキュメントIDをクエリし、次にドキュメントIDに従って対応するドキュメントを照合します)
- DFS_QUERY_THEN_FETCH(最初にポイントを計算してからクエリを実行する)
- 「ここでは、サブ頻度の単語頻度を参照し、ドキュメント(用語頻度、ドキュメント頻度)はよく知られています。出現頻度が高いほど、相関が強くなります。」
一般に、最もよく使用するのはQUERY_THEN_FETCHです。最初のタイプのクエリはドキュメントコンテンツ全体を返します(QUERY_AND_FETCH)は、1つのシャードのみをチェックする必要があるリクエストにのみ適しています。
QUERY_THEN_FETCHの全体的なプロセスフローは大まかに次のとおりです。
- クライアント要求は、クラスター内のノードに送信されます。クラスター上の各ノードは調整ノード(調整ノード)です
- 次に、調整ノードは検索要求をすべてのシャード(プライマリシャードとレプリカシャードの両方)に転送します。
- 各シャードは検索結果
(doc id)
を調整ノードに返し、調整ノードはデータのマージ、並べ替え、ページングなどの操作を実行して最終結果を生成します。 - 次に、調整ノードは
doc id
各ノードによって処理されて実際のdocument
データをプルし、最終的にクライアントに返されます。
クエリフェーズ中にノードが行うこと:
- 調整ノードは、クエリコマンドをターゲットシャードに送信します(リクエストをメインシャードまたはレプリカシャードに転送します)
doc id
調整ノードに返されるデータノード(各シャードでのフィルタリング、並べ替えなど)
フェッチフェーズフェーズ中にノードが行うことは次のとおりです。
- 調整ノードは、データノードから返されたデータを取得し、
doc id
これらをdoc id
集約してから、キャプチャコマンドをターゲットデータフラグメントに送信します(Docレコード全体を取得したい)。 - 調整ノード
doc id
から送信されたデータに応じて、データノードは実際に必要なデータをプルして調整ノードに返します。
元のアドレス:https://mp.weixin.qq.com/s?__ biz = MzI4Njg5MDA5NA ==&mid = 2247486522&idx = 1&sn = 7b6080756d0711c646fb47d5db49fc97&chksm = ebd74d3bdca0c42d35f7e2097e4fbaca