如何使用 Elasticsearch Nest 在一次操作中按 ID 删除多个文档
How to delete several documents by ID in one operation using Elasticsearch Nest
我正在构建一些抽象函数供我的应用程序调用,这将通过 Nest 访问 elasticsearch。其中一个函数是 Delete(string id)
调用,它很容易实现。我这样做如下:
public void Delete(string id)
{
esClient.Delete(id);
}
现在假设我想做同样的事情,但要同时对多个文档进行操作。我最初的预感是做这样的事情:
public void Delete(IEnumerable<string> ids)
{
esClient.DeleteMany(ids); // won't compile
}
正如我的评论所述,这样做不会编译。 Nest中按ID批量删除文件的正确方法是什么?
要使用 esClient.DeleteMany(..)
,您必须传递要删除的对象集合。
var objectsToDelete = new List<YourType> {.. };
var bulkResponse = client.DeleteMany<YourType>(objectsToDelete);
您可以使用以下代码解决此问题:
var ids = new List<string> {"1", "2", "3"};
var bulkResponse = client.DeleteMany<YourType>(ids.Select(x => new YourType { Id = x }));
第三个选项,使用批量删除:
var bulkResponse = client.Bulk(new BulkRequest
{
Operations = ids.Select(x => new BulkDeleteOperation<YourType>(x)).Cast<IBulkOperation>().ToList()
});
我当时正在为 ElasticSearch 5.x 开发一个 .NET 客户端,我很幸运有下面的代码 运行(以及所有单元测试的成功) 使用 ID 进行批量删除:
//IList<string> ids = ...
var descriptor = new BulkDescriptor();
foreach (var id in ids.Where(x => !string.IsNullOrWhiteSpace(x)))
descriptor.Delete<T>(x => x
.Id(id))
.Refresh(Refresh.WaitFor);
var response = await _client.BulkAsync(descriptor);
我正在构建一些抽象函数供我的应用程序调用,这将通过 Nest 访问 elasticsearch。其中一个函数是 Delete(string id)
调用,它很容易实现。我这样做如下:
public void Delete(string id)
{
esClient.Delete(id);
}
现在假设我想做同样的事情,但要同时对多个文档进行操作。我最初的预感是做这样的事情:
public void Delete(IEnumerable<string> ids)
{
esClient.DeleteMany(ids); // won't compile
}
正如我的评论所述,这样做不会编译。 Nest中按ID批量删除文件的正确方法是什么?
要使用 esClient.DeleteMany(..)
,您必须传递要删除的对象集合。
var objectsToDelete = new List<YourType> {.. };
var bulkResponse = client.DeleteMany<YourType>(objectsToDelete);
您可以使用以下代码解决此问题:
var ids = new List<string> {"1", "2", "3"};
var bulkResponse = client.DeleteMany<YourType>(ids.Select(x => new YourType { Id = x }));
第三个选项,使用批量删除:
var bulkResponse = client.Bulk(new BulkRequest
{
Operations = ids.Select(x => new BulkDeleteOperation<YourType>(x)).Cast<IBulkOperation>().ToList()
});
我当时正在为 ElasticSearch 5.x 开发一个 .NET 客户端,我很幸运有下面的代码 运行(以及所有单元测试的成功) 使用 ID 进行批量删除:
//IList<string> ids = ...
var descriptor = new BulkDescriptor();
foreach (var id in ids.Where(x => !string.IsNullOrWhiteSpace(x)))
descriptor.Delete<T>(x => x
.Id(id))
.Refresh(Refresh.WaitFor);
var response = await _client.BulkAsync(descriptor);