2012-04-17 18 views
7

のは、私は次のマッピングで、ElasticSearchインデックスにtagタイプがあるとしましょう:ElasticSearchで複数のアイテムを更新するにはどうすればよいですか?

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

各エントリは、タグ、およびそのタグへのエイリアスの配列です。ここでは例の項目は次のとおりです。

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

時から、私は彼らの別名を持つ新しいタグの単語を追加し、既存のタグの単語に新しいエイリアスを追加したいです。

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

タグワードを検索し、そのドキュメントを取得し、エイリアスの配列にエイリアスが既に存在するかどうかを検索することができます。しかし、これは良い解決策のようには聞こえません。

一括更新の方法はありますか?

答えて

7

下位のelasticsearchストレージLuceneには更新操作がありません。したがって、すべての更新は、レコードを検索し、古いバージョンを削除し、新しいバージョンを追加することによって行われます。 elasticsearchでは、Update APIを使用して、レコードをクライアントまでずっと保存することができます。それでもレコードを見つける必要があります。おそらくあなたが望むのはUpdate by queryですが、残念ながらまだ実装されていません。

+1

クエリによる更新はまだElasticに追加されていませんが、[プラグイン](https://github.com/yakaz/elasticsearch-action-updatebyquery/)が存在します。 –

+1

Elasticsearch 2.3以降、クエリによる更新が利用可能です - https://www.elastic.co/guide/en/elasticsearch/reference/2.3/docs-update-by-query.html – PhaedrusTheGreek

2

弾性検索はUpdate APIです。そのAPIを使用すると、以下の操作を行うことができます。また

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

こんにちはエリック、これはのためです単一のドキュメントの更新権ですか? –

+0

PHPで単一のレコードを更新する方法を教えてください。 –

0

を使用すると、同じIDを持つ同じ値を追加する場合、それは自動的に古いデータを更新します。

6

_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" 
} 
} 
0

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

次のコードを使用して、spring javaクライアントを使用して同じことを行うことができます。次に、コードで使用される依存関係を示します。

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); 
} 
2

これは私に役立ちます。

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 
+0

ありがとう、私のために働く!弾性検索5.4を使用する –

1

Elasticsearch 2.3.0が待望Reindex APIの一部としてUpdate By Query APIを導入しました。一例として、

は、ここでそれが存在する場合は、特定のフィールドを削除するには、すべての文書を更新することができる方法である:

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

上記の例では、インラインスクリプトを使用するため、script.inline: onelasticsearch.ymlでそれを有効にしてください。