UpdateByQueryAsync
是 Elasticsearch 提供的一个 API,用于根据查询条件批量更新文档。嵌套(Nested)是 Elasticsearch 中一种数据结构,允许在一个文档中存储一个数组的子文档,并且可以对这些子文档进行独立的查询和更新。
UpdateByQueryAsync
允许你根据查询条件一次性更新多个文档,提高效率。Elasticsearch 中的嵌套类型主要有以下几种:
嵌套文档适用于以下场景:
假设我们有一个包含嵌套文档的索引 users
,结构如下:
{
"name": "John Doe",
"age": 30,
"addresses": [
{
"city": "New York",
"zip": "10001"
},
{
"city": "Los Angeles",
"zip": "90001"
}
]
}
我们希望更新所有 addresses
中 city
为 "New York" 的 zip
字段。可以使用以下代码:
using Nest;
using System.Threading.Tasks;
public class ElasticsearchExample
{
private static ElasticClient client = new ElasticClient(new ConnectionSettings(new Uri("http://localhost:9200")));
public static async Task UpdateAddressesAsync()
{
var updateResponse = await client.UpdateByQueryAsync<UsersDocument>(u => u
.Query(q => q
.Nested(n => n
.Path(p => p.Addresses)
.Query(qn => qn
.Match(m => m
.Field(f => f.Addresses.First().City)
.Query("New York")
)
)
)
)
.Script(sc => sc
.Inline("ctx._source.addresses[index].zip = params.newZip",
new Dictionary<string, object> { { "newZip", "10002" } })
.Lang("painless")
.Params(new Dictionary<string, object> { { "index", ctx => ctx.Source.Addresses.IndexOf(ctx._source.Addresses) } })
)
);
Console.WriteLine($"Updated {updateResponse.Total} documents.");
}
}
public class UsersDocument
{
public string Name { get; set; }
public int Age { get; set; }
public List<Address> Addresses { get; set; }
}
public class Address
{
public string City { get; set; }
public string Zip { get; set; }
}
通过以上方法,你可以有效地使用 UpdateByQueryAsync
和嵌套文档进行部分更新。
领取专属 10元无门槛券
手把手带您无忧上云