転載この記事:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html、ESバージョン6.3.0
複数の文書を取得
Elasticsearch速度が非常に速くなって、それでも速くています。ネットワーク遅延及びオーバーヘッド処理を回避複数に要求を個別に各要求を取ります。あなたはElasticsearchからの文書の多くを取得する必要がある場合は、より高速なすべての文書を取得するために一つずつよりも、要求にこれらの要求を取得するために、要求文書を複数取得したり、mgetはAPIを使用します。
MGET APIは、文書、_type、_idメタデータの各ノードに対して定義された_indexアレイパラメータドキュメントアレイです。あなたが1つのまたは複数の定義されたフィールドを検索したい場合は、_sourceパラメータを定義することができます。
POST /_mget
{
"docs" : [
{
"_index" : "website2",
"_type" : "blog",
"_id" : 1
},
{
"_index" : "website",
"_type" : "pageviews",
"_id" : 1,
"_source": "views"
}
]
}
注:Elastcisearch6.3 Iインデックスは、文書タイプの複数をサポートしていないので、この二つMGETインデックスに操作される
応答ドキュメントアレイはまた要求によって定義された順序で配置されている各文書への応答を含む、本体を含みます。単独のような各応答は同じボディに要求応答を取得します:
{
"docs": [
{
"_index": "website2",
"_type": "blog",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"title": "My first blog entry",
"text": "Just trying this out..."
}
},
{
"_index": "website",
"_type": "pageviews",
"_id": "1",
"_version": 2,
"found": true,
"_source": {
"views": 2
}
}
]
}
実際には、すべての文書が同じ_indexと_typeを持っている場合は、あなたの代わりに、ドキュメントの簡単なIDS配列の完全な配列のことができます:
POST /website2/blog/_mget
{
"ids" : [ "1", "2" ]
}
私たちは第2の文書が存在しない要求したことに注意してください。私たちは、ブログのタイプを定義しますが、文書型IDは、ページビューのための1です。この文書では、それはレスポンスボディで語られますが存在しません。
{
"docs": [
{
"_index": "website2",
"_type": "blog",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"title": "My first blog entry",
"text": "Just trying this out..."
}
},
{
"_index": "website2",
"_type": "blog",
"_id": "2",
"found": false
}
]
}
実際には第2の文書は、文書の検索には影響しませんが存在しません。各文書検索と報告が独立しています。
言及したが、文書が見つかりましたが、HTTP要求または200ステータスコードされていません。実際には、すべての文書が発見されていない場合でも、要求はまだmgetは、要求自体の成功ので、200を返します。あなたは、各ドキュメントが成功したかどうかを知りたい場合は、あなたが見つかりました兆候をチェックする必要があります。
更新時に一括操作
私たちは、複数の文書を検索できるようにするmgetは一回として、のように、バルクAPIは、私たちは複数のドキュメントは、インデックス作成、更新、または削除を実装するために単一の要求を使用することができます。この流れは、インデックスに似たようなデータロギング活動のために非常に有用である、彼らはシーケンシャルデータの何百ものバッチにインデックスを作成することができます。
バルクとしての体を要求し、それは少し珍しいがあります。
{アクション:{メタデータ}} \ N
{リクエストボディ} \ N
{アクション:{メタデータ}} \ N
{リクエストボディ} \ N
...
このフォーマットは、ライン接続シンボルJSON文書ストリーム(ストリーム)による「の\ n」行に類似しています。注意すべき二つの重要なポイント:
- 各行は、最後の行を含む、末尾に「\ n」はシンボル、で終わらなければなりません。これらは行わ有効なマーカーとして各列から分離されています。
- JSONは造園を印刷することができないことを意味 - 逃げられない改行を含めることはできませんデータの各行は、彼らが分析を妨害します。
アクション/メタデータはこの行は、どの文書(その文書)を介して行われます(どのようなアクション)文書の動作を定義します。
行動(アクション)は、次のようにする必要があります。
行動 |
説明 |
作ります |
文書の作成が存在しない場合。「ドキュメントの作成」を参照してください。 |
指数 |
新しいドキュメントを作成するか、既存の文書を交換してください。「ドキュメントのインデックス」と「アップデートドキュメント」を参照してください。 |
更新 |
ローカルアップデートドキュメント。「部分更新」を参照してください。 |
削除 |
文書を削除します。「文書の削除」を参照してください。 |
インデックスでは、作成、更新、またはあなたは、ドキュメント_index、削除_type、_idのメタデータ(メタデータ)を指定する必要があります。
このような削除等の要求は次のようになります。
{ "削除":{ "_index": "ウェブサイト"、 "_type": "ブログ"、 "_id": "123"}}
リクエストボディ組成_sourceドキュメントによって(リクエストボディは) -ドキュメントは、フィールドとその値の一部が含まれています。理にかなっていると、インデックス操作を、作成する必要があります:あなたは、インデックスにドキュメントを提供しなければなりません。
これらの更新操作も必要とされるが、組成物は、リクエスト本体更新API(DOC、UPSERT、スクリプト、等)と一致しなければなりません。削除操作部材(リクエストボディ)を要求する必要はありません。
{ "作成":{ "_index": "ウェブサイト"、 "_type": "ブログ"、 "_id": "123"}}
{ "タイトル": "私の最初のブログ記事"}
あなたは_idを定義しない場合は、IDが自動的に作成されます。
{ "インデックス":{ "_index": "ウェブサイト"、 "_type": "ブログ"}}
{ "タイトル": "私の第二のブログ記事"}
一緒にこれらを配置するには、バルクリクエストフォームは、このようなことです:
POST / _bulk
{ "削除":{ "_インデックス": "WEBSITE2"、 "_タイプ": "ブログ"、 "_ ID": "1"}} ##行为(アクション)を削除没有请求体
{ "作成":{ "_index": "WEBSITE2"、 "_タイプ": "ブログ"、 "_ ID": "1"}}
{ "タイトル": "私の最初のブログ記事"}
、{ "インデックス":{ "_インデックス": "WEBSITE2" 、 "_タイプ":}} "ブログ"
{ "タイトル": "私の第二のブログ投稿を"}
、{ "更新":{ "_インデックス": "WEBSITE2"、 "_タイプ": "ブログ"、 "_ ID": "1 」、 "_ retry_on_conflict":3}}
{ "DOC":{ "タイトル": "私の更新のブログ記事"}} ##记得最后一个换行符
Elasticsearch応答は、各リクエストの結果を一覧表示項目の配列を、含まれており、結果の並び順は、私たちの要求と同じです。
{
"took": 101,
"errors": false, ##所有子请求都成功完成
"items": [
{
"delete": {
"_index": "website2",
"_type": "blog",
"_id": "1",
"_version": 2,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 3,
"status": 200
}
},
{
"create": {
"_index": "website2",
"_type": "blog",
"_id": "1",
"_version": 3,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 3,
"status": 201
}
},
{
"index": {
"_index": "website2",
"_type": "blog",
"_id": "3obs92cB_9PWWV036uyh",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 3,
"status": 201
}
},
{
"update": {
"_index": "website2",
"_type": "blog",
"_id": "1",
"_version": 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 3,
"status": 200
}
}
]
}
各サブ要求が独立して実行されているので、間違ったサブリクエストは、他の要求には影響しません。すべての要求が失敗した場合は、エラーフラグが真のトップに設定され、エラーが対応する要求に詳細に報告されます
POST / _bulk
{ "作成":{ "_インデックス": "WEBSITE2"、 "_タイプ": "ブログ"、 "_ ID": "1"}}
{ "タイトル": "作成できません-それは、すでに存在しています"}
、{」インデックス":{" _インデックス":" WEBSITE2" 、 "_タイプ": "ブログ"、 "_ ID": "1"}}
{ "タイトル": "しかし、私たちはそれを更新することができます"}
応答では、文書がすでに存在しているため、1が失敗した文書を作成し表示されますが、インデックスは、後に1つの要求が成功した上で実行します:
{
"took": 40,
"errors": true, ##一个或多个请求失败
"items": [
{
"create": {
"_index": "website2",
"_type": "blog",
"_id": "1",
"status": 409,##这个请求的状态码被报告为409Conflict
"error": {
"type": "version_conflict_engine_exception",
"reason": "[blog][1]: version conflict, document already exists (current version [4])", ##错误消息说明了什么请求错误
"index_uuid": "W3VTB9NyRNC3tgfYpnqkvA",
"shard": "3",
"index": "website2"
}
}
},
{
"index": {
"_index": "website2",
"_type": "blog",
"_id": "1",
"_version": 5,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 4,
"_primary_term": 3,
"status": 200 ##第二个请求成功了状态码是200
}
}
]
}
これらの命令バルクの要求はアトミックではありません - 彼らはトランザクションを実装することはできません。各別個の操作要求は、要求が成功したか否かをそれぞれが他の動作に干渉しません
繰り返さないでください
あなたは同じインデックスで同じバッチインデックスログデータを入力することがあります。メタデータが重複しているドキュメントごとに同じことを指定します。mgetはAPIのように、バルク要求もURL / _indexで使用することができますか/ _index / _type:POST / WEBSITE3 / _bulk
{ "インデックス":{ "_type": "ログイン"}}
{ "イベント": "ユーザーがログイン"}
あなたはまだそれがデフォルトとして適用範囲の不存在下でURLの値を使用します、_indexと_typeメタデータ行をカバーすることができます
どのくらいの大きさと考えられている
バッチ全体の要求は、私たちの要求を受け入れるようにノードのメモリにロードする必要があり、要求をので、笑うために、他の要求に利用できる、より大きなメモリ。最適な一括要求のサイズがあります。このサイズよりも、だけでなく、パフォーマンスを向上させるためには、減少する可能性はありません。
最適なサイズは、当然のことながら、固定数ではありません。それはすべてのハードウェアに依存し、ドキュメントのサイズと複雑さだけでなく、インデックス作成と検索をロードします。幸いなことに、このスイートスポット(sweetspot)は見つけることは簡単です:
各バッチあまりにもあなたのサイズを示す、パフォーマンスが低下し始めたときに、サイズの成長とともに、バッチインデックス標準文書に試してみてください。番号は、あなたの文書が非常に大きい場合、あなたは小さなバッチを使用することができ、1000年および5000の文書間で開始することができます。
通常、あなたの要求のバッチの物理的な大きさに焦点を当てて非常に便利です。1kBの1MBの文書異なる一千と千の文書。良好なバッチは、好ましくは、5〜15メガバイトのサイズとの間に維持されます。