如何更新 Elasticsearch 文档中的嵌套对象?
How to Update nested objects in Elasticsearch documents?
我正在尝试寻找使用嵌套对象更新文档的最佳实践:
我正在使用 ES 作为视图缓存:
假设我的 SQL 数据库中有两个实体:
第一个是 Address 和 Homes,它们之间的关系太多了
Address Table has columns=> Id , Street, ZipCode
Home Table has colmns=> Id, AddressId(FK), price
我将它们存储在 ES 聚合中:
Home : {
Id: 1,
price : 3000,
Address :{
id: 1,
street: "blabla",
zibcode : 12345
}
}
如果我对地址进行了任何更改,我想用新值更新主页索引中包含相同地址的所有 主页文档。
我需要知道如何在对 ES 的一次请求中更新同一索引中的所有文档。
_update_by_query
可能就是您想要的。
这不是很漂亮,但它应该可以完成工作:
PUT test/_doc/1
{
"Id": 1,
"price": 3000,
"Address": {
"id": 1,
"street": "blabla",
"zipcode": 12345
}
}
POST test/_update_by_query
{
"query": {
"term": {
"Address.id": 1
}
},
"script": {
"source": "ctx._source['Address']['id'] = 2;ctx._source['Address']['street'] = 'foo';ctx._source['Address']['zipcode'] = 5678"
}
}
GET test/_doc/1
然后输出是:
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_version" : 9,
"_seq_no" : 8,
"_primary_term" : 1,
"found" : true,
"_source" : {
"Address" : {
"zipcode" : 5678,
"street" : "foo",
"id" : 2
},
"price" : 3000,
"Id" : 1
}
}
我正在尝试寻找使用嵌套对象更新文档的最佳实践: 我正在使用 ES 作为视图缓存:
假设我的 SQL 数据库中有两个实体: 第一个是 Address 和 Homes,它们之间的关系太多了
Address Table has columns=> Id , Street, ZipCode
Home Table has colmns=> Id, AddressId(FK), price
我将它们存储在 ES 聚合中:
Home : {
Id: 1,
price : 3000,
Address :{
id: 1,
street: "blabla",
zibcode : 12345
}
}
如果我对地址进行了任何更改,我想用新值更新主页索引中包含相同地址的所有 主页文档。 我需要知道如何在对 ES 的一次请求中更新同一索引中的所有文档。
_update_by_query
可能就是您想要的。
这不是很漂亮,但它应该可以完成工作:
PUT test/_doc/1
{
"Id": 1,
"price": 3000,
"Address": {
"id": 1,
"street": "blabla",
"zipcode": 12345
}
}
POST test/_update_by_query
{
"query": {
"term": {
"Address.id": 1
}
},
"script": {
"source": "ctx._source['Address']['id'] = 2;ctx._source['Address']['street'] = 'foo';ctx._source['Address']['zipcode'] = 5678"
}
}
GET test/_doc/1
然后输出是:
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_version" : 9,
"_seq_no" : 8,
"_primary_term" : 1,
"found" : true,
"_source" : {
"Address" : {
"zipcode" : 5678,
"street" : "foo",
"id" : 2
},
"price" : 3000,
"Id" : 1
}
}