12

假设我tag在 ElasticSearch 索引中有一个类型,具有以下映射:

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

每个条目都是一个标签,以及该标签的别名数组。这是一个示例项目:

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

有时,我想添加新的标签词及其别名,并为现有的标签词添加新的别名。

添加带有别名的新标签词很容易,它只是一个新文档。但是,如何以理智的方式向现有标签词添加新别名?

我知道我可以只搜索标签词,获取其文档,搜索以查看别名是否已存在于别名数组中,如果不添加,则保存。但是 - 这听起来不是一个好的解决方案。

有没有办法进行批量更新?

4

9 回答 9

11

All updates in ElasticSearch are done by finding the record, deleting the old version and adding the new version. You can save a little bit on moving records all the way to the client by using Update API. It would still require finding the record though.

What you, probably, want is Update by query.

于 2012-04-17T13:16:36.087 回答
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 回答
4

这对我有用。

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
于 2016-01-21T01:50:00.150 回答
3

Elasticsearch 2.3.0 引入了Update By Query API作为期待已久的Reindex API的一部分。

例如,以下是如何更新所有文档以删除某个字段(如果存在):

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

elasticsearch.yml上面的示例使用内联脚本,因此请务必在script.inline: on.

于 2016-05-06T17:23:03.217 回答
2

Elastic Search 有一个更新 API。使用该 API,您可以执行以下操作:

curl -XPOST 'localhost:9200/test/tag/weak/_update' -d '{
    "script" : "ctx._source.aliases += faint"
}'
于 2013-04-09T15:50:33.490 回答
0

此外,如果您添加具有相同 id 的相同值,它将自动更新旧数据。

于 2014-04-01T14:04:44.577 回答
0

您可以使用ElasticSeach Bulk API使用单个 API 调用更新多个文档

卷曲示例

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

'

注意最后一行数据必须以换行符 \n 结尾。这就是为什么你会在 json 的最后一行注意到'

于 2020-03-09T06:15:12.557 回答
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 回答
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);
}
于 2015-11-10T07:46:46.437 回答