如何在 ElasticSearch 中更新多个项目



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

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

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

{
    "word": "weak",
    "aliases": ["anemic", "anaemic", "faint", "flimsy"]
}
有时,我想添加新的标签词

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

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

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

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

使用 _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"
}
}

ElasticSearch 中的所有更新都是通过查找记录、删除旧版本并添加新版本来完成的。可以使用更新 API 在将记录一直移动到客户端时节省一点时间。不过,它仍然需要找到记录。

您可能想要的是按查询更新。

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启用它。

这对

我有用。

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

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

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

您可以使用 ElasticSeach 批量 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} }
'

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

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

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 中被禁用。启用该功能或使用预编译脚本来使用此功能。

您可以使用使用以下代码使用 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);
}

相关内容

  • 没有找到相关文章

最新更新