12

tag次のマッピングを使用して、ElasticSearchインデックスにタイプがあるとします。

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

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

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

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

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

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

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

4

9 に答える 9

11

_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"
}
}
于 2015-06-08T11:16:31.113 に答える
11

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

おそらく、あなたが望むのはUpdate by queryです。

于 2012-04-17T13:16:36.087 に答える
4

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

入力リスト.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
于 2016-01-21T01:50:00.150 に答える
3

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

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

于 2016-05-06T17:23:03.217 に答える
2

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

curl -XPOST 'localhost:9200/test/tag/weak/_update' -d '{
    "script" : "ctx._source.aliases += faint"
}'
于 2013-04-09T15:50:33.490 に答える
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 の新しいバージョンでは動的スクリプトが無効になっていることに注意してください。それを有効にするか、この機能を使用するために事前にコンパイルされたスクリプトを使用してください。

于 2015-09-14T10:32:38.007 に答える