Elasticsearch-あなたのクラスタを探索する2

36558 ワード

1.データの変更
Elasticsearchはほぼリアルタイムでデータ操作と検索機能を提供します。デフォルトでは、索引/更新/削除データから検索結果に表示される時間まで、一秒の遅延(リフレッシュ間隔)があります。これはSQLなど他のプラットフォームとの重要な違いです。
索引と置換ドキュメント
先に確認します
GET /customer/_doc/1?pretty
結果は以下の通りです
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "John Doe"
  }
}
下記のコードを再実行します。
PUT /customer/_doc/1?pretty
{
  "name": "John Doe"
}
結果:
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,   --    2
  "result" : "updated", --      ,        ,   created
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1, --      1
  "_primary_term" : 1
}
最初に作成したものと比較します。
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created", --      
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
もしdocumentのidが同じなら、戻ってきたデータは前のデータに置き換えられます。
下記のコードを実行します。
PUT /customer/_doc/2?pretty
{
  "name": "Jane Doe"
}
注意:ここではインデックスIDが2の新しいdocumentを作成します。結果は以下の通りです
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "result" : "created", --       
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
インデックスの場合、ID部分は任意です。指定されていない場合、ElasticsearchはランダムIDを生成し、それを使ってドキュメントを索引します。Elasticsearchで生成された実際のID(または、前の例で明示的に指定されたコンテンツ)は、インデックスAPI呼び出しの一部として返されます。
以下の例は、どのようにして明示的IDがない場合にインデックスドキュメントを表示しますか?ここはPOST要求です。
POST /customer/_doc?pretty
{
  "name": "Jane snow post"
}
結果は以下の通りです
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "HH8_UGgB4DiB3AKG7sYS", --    id
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}
先ほど作成した文書を照会します。
GET /customer/_doc/HH8_UGgB4DiB3AKG7sYS?pretty
結果は以下の通りです
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "HH8_UGgB4DiB3AKG7sYS",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "name" : "Jane snow post"
  }
}
2.文書documentを更新する
ドキュメントを索引と置換できるほか、ドキュメントの更新もできます。Elasticsearchは実際に内部で更新されていませんので、ご注意ください。更新するたびに、Elasticsearchは古い文書を削除し、更新された新しい文書を適用したインデックスを作成します。
更新例:
POST /customer/_doc/1/_update?pretty
{
  "doc": { "name": "Jane Doe" }
}
応答:
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 3,
  "_primary_term" : 1
}
クエリー:
GET /customer/_doc/1?pretty
応答:
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "found" : true,
  "_source" : {
    "name" : "Jane Doe"
  }
}
新しい内容を更新して追加します。
POST /customer/_doc/1/_update?pretty
{
  "doc": { "name": "Jane Doe", "age": 20 }
}
クエリの結果:
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 4,
  "found" : true,
  "_source" : {
    "name" : "Jane Doe",
    "age" : 20
  }
}
スクリプトで更新:
POST /customer/_doc/1/_update?pretty
{
  "script" : "ctx._source.age += 5"
}
再度の検索結果は以下の通りです。
{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 5,
  "found" : true,
  "_source" : {
    "name" : "Jane Doe",
    "age" : 25
  }
}
上記の例では、ctx._.sourceとは、現在更新されるソースドキュメントのことです。
3.文書の削除
DELETE /customer/_doc/2?pretty
4.バッチ処理
索引、個々のドキュメントの更新、削除ができるほか、Elasticsearchは_を使用しても提供されています。bulk APIは、上述の任意の動作を一括して実行する機能である。この機能は非常に重要であり、非常に効果的なメカニズムを提供しているので、できるだけ速く複数の動作を実行し、できるだけ少なくネットワークを往復することができます。
次の例では、2つの索引を作成します。
curl -X POST "localhost:9200/customer/_doc/_bulk?pretty" -H 'Content-Type: application/json' -d'
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }'
結果は以下の通りです
{
  "took" : 1810,
  "errors" : false,
  "items" : [
    {
      "index" : {
        "_index" : "customer",
        "_type" : "_doc",
        "_id" : "1",
        "_version" : 6,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 6,
        "_primary_term" : 1,
        "status" : 200
      }
    },
    {
      "index" : {
        "_index" : "customer",
        "_type" : "_doc",
        "_id" : "2",
        "_version" : 2,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 1,
        "_primary_term" : 1,
        "status" : 200
      }
    }
  ]
}

以下の例では、第1の文書(IDは1)を更新し、第2の文書(IDは2)を一括操作で削除します。
curl -X POST "localhost:9200/customer/_doc/_bulk?pretty" -H 'Content-Type: application/json' -d'
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'
結果:
{
  "took" : 1867,
  "errors" : false,
  "items" : [
    {
      "update" : {
        "_index" : "customer",
        "_type" : "_doc",
        "_id" : "1",
        "_version" : 7,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 7,
        "_primary_term" : 1,
        "status" : 200
      }
    },
    {
      "delete" : {
        "_index" : "customer",
        "_type" : "_doc",
        "_id" : "2",
        "_version" : 3,
        "result" : "deleted",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 2,
        "_primary_term" : 1,
        "status" : 200
      }
    }
  ]
}
Bulk APIは、一つの操作が失敗しない。単一操作が何らかの理由で失敗した場合、その後の残りの動作を処理し続けます。一括APIが戻ると、特定の動作が失敗したかどうかを確認するために、各動作に状態を提供します。