假设我在ElasticSearch索引中有tag
类型,并带有以下映射:
{
"tag": {
"properties": {
"tag": {"type": "string", "store": "yes"},
"aliases": {"type": "string"}
}
}
}
每个条目都是一个标记,以及该标记的别名数组。这是一个示例项目:
{
"word": "weak",
"aliases": ["anemic", "anaemic", "faint", "flimsy"]
}
有时,我想添加带有别名的新标记词,并为现有标记词添加新别名。
使用别名添加新标记词很容易,它只是一个新文档。但是,如何以理智的方式向现有标记词添加新别名?
我知道我可以只搜索标记字,获取其文档,搜索别名数组中是否已经存在别名,如果不是,则添加它,而不是保存。然而 - 这听起来不是一个好的解决方案。
有没有办法进行批量更新?
答案 0 :(得分:9)
ElasticSearch中的所有更新都是通过查找记录,删除旧版本和添加新版本来完成的。您可以使用Update API保存一点点将记录移动到客户端。它仍然需要找到记录。
你可能想要的是Update by query。
答案 1 :(得分:8)
使用_bulk:
尝试此操作Permissions
答案 2 :(得分: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 :(得分: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
中启用它。
答案 4 :(得分:2)
弹性搜索有一个Update API。使用该API,您可以执行以下操作:
curl -XPOST 'localhost:9200/test/tag/weak/_update' -d '{
"script" : "ctx._source.aliases += faint"
}'
答案 5 :(得分:0)
此外,如果您使用相同的ID添加相同的值,它将自动更新旧数据。
答案 6 :(得分: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中禁用了动态脚本。启用它或使用预编译的脚本来使用此功能。
答案 7 :(得分: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);
}
答案 8 :(得分:0)
您可以使用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} }
'
注意。最后一行数据必须以换行符\ n结尾。这就是为什么您会在json的最后一行注意到'的原因。