web-dev-qa-db-ja.com

ElasticSearchで複数のアイテムを更新するにはどうすればよいですか?

ElasticSearchインデックスにtag型があり、次のマッピングがあるとします。

{
    "tag": {
        "properties": {
            "tag": {"type": "string", "store": "yes"},
            "aliases": {"type": "string"}
        }
    }
}

各エントリはタグであり、そのタグのエイリアスの配列です。アイテムの例を次に示します。

{
    "Word": "weak",
    "aliases": ["anemic", "anaemic", "faint", "flimsy"]
}

時々、エイリアスを使用して新しいタグワードを追加したり、既存のタグワードに新しいエイリアスを追加したりしたいと思います。

エイリアスを使用して新しいタグワードを追加するのは簡単です。これは単なる新しいドキュメントです。ただし、既存のタグワードに新しいエイリアスを適切な方法で追加するにはどうすればよいですか?

タグWordを検索し、そのドキュメントを取得し、エイリアスがエイリアスの配列にすでに存在するかどうかを検索して、追加しない場合は、保存するだけです。ただし、これは良い解決策のようには思えません。

一括更新を行う方法はありますか?

11
Doron

ElasticSearchのすべての更新は、レコードを検索し、古いバージョンを削除し、新しいバージョンを追加することによって行われます。 pdate API を使用すると、レコードをクライアントに移動する時間を少し節約できます。ただし、それでもレコードを見つける必要があります。

おそらくあなたが欲しいのは クエリによる更新 です。

10
imotov

_ bulk を使用してこれを試してください:

http://127.0.0.1:9200/myindex/type/_bulk
{
"update": {
    "_index": "myindex",
    "_type": "type",
    "_id": "myid"
}
}{
"doc": {
    "field": "new value"
}
}{
"update": {
    "_index": "myindex",
    "_type": "type",
    "_id": "id"
}
}{
"doc": {
    "field": "new value"
}
}
9
Varshaan

Elasticsearch 2.3.0では、待望の Reindex API の一部として pdate By Query API が導入されました。

例として、特定のフィールドが存在する場合にそれを削除するようにすべてのドキュメントを更新する方法を次に示します。

POST /myindex/mytype/_update_by_query
{
  "script": {
    "inline": "ctx._source.remove(\"remove\")"
  },
  "query": {
    "exists": {
      "field": "remove"
    }
  }
}

上記の例ではインラインスクリプトを使用しているため、elasticsearch.ymlscript.inline: onを使用して有効にしてください。

3

これは私にとってはうまくいきます。

input_list.dat:

{ "index" : { "_index": "my_index", "_type": "my_type", "_id": "existing-value" } }

{ "Field_to_update": "New_Value" }

{ "index" : { "_index": "my_index", "_type": "my_type", "_id": "existing_value" } }

{ "Field_to_update": "New_Value" }

コマンド:

curl -k -XPOST 'https://my_Host:9200/my_url/_bulk' --data-binary "@input_list.dat"; echo
3
Rockoder

Elastic Searchには pdate API があります。そのAPIを使用すると、次のことができます。

curl -XPOST 'localhost:9200/test/tag/weak/_update' -d '{
    "script" : "ctx._source.aliases += faint"
}'
2
Eric Vidal

ElasticSeach Bulk API を使用して、単一のAPI呼び出しを使用して複数のドキュメントを更新できます。

CURLの例

curl --location --request POST 'localhost:9200/whatsapp/_bulk' \
--header 'Content-Type: application/json' \
--data-raw '{ "update" : {"_id" : 692, "_index" : "whatsapp","_type":"_doc","retry_on_conflict" : 3} }
{ "doc" : {"thread_status" : 1} }
{ "update" : {"_id" : 693, "_index" : "whatsapp","_type":"_doc","retry_on_conflict" : 3} }
{ "doc" : {"thread_status" : 1} }

'

[〜#〜] note [〜#〜]データの最後の行は改行文字で終了する必要があります\ n。そのため、jsonの終了行に 'が表示されます。

0
Rishabh Rawat

ElasticsearchのバルクAPIは、少なくともJavaクライアントでは、更新リクエストにも使用できます。

List list = new Arraylist();
list.add("hello");
BulkProcessor bulk = new BulkProcessor();
UpdateRequest update = new UpdateRequest("index", "type", "id1");
update.script("ctx._source.aliases+= newaliases");  //dynamic script
update.addScriptParam("newaliases", list);
bulk.add(update);

Elasticsearchの新しいバージョンでは、動的スクリプトが無効になっていることに注意してください。これを有効にするか、この機能を使用するためにコンパイル済みのスクリプトを使用してください。

0
Mohit

また、同じIDで同じ値を追加すると、古いデータが自動的に更新されます。

0
Oguz Kurtcuoglu

次のコードを使用して、spring Java client)を使用して同じことを行うことができます。以下は、コードで使用される依存関係です。

import org.elasticsearch.action.update.UpdateRequest;

import org.elasticsearch.index.query.QueryBuilder;

import org.springframework.data.elasticsearch.core.query.UpdateQuery;

import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder;

private UpdateQuery updateExistingDocument(String Id) {
    // Add updatedDateTime, CreatedDateTime, CreateBy, UpdatedBy field in existing documents in Elastic Search Engine
    UpdateRequest updateRequest = new UpdateRequest().doc("UpdatedDateTime", new Date(), "CreatedDateTime", new Date(), "CreatedBy", "admin", "UpdatedBy", "admin");

    // Create updateQuery
    UpdateQuery updateQuery = new UpdateQueryBuilder().withId(Id).withClass(ElasticSearchDocument.class).build();
    updateQuery.setUpdateRequest(updateRequest);

    // Execute update
     elasticsearchTemplate.update(updateQuery);
}
0
ashisahu