如何使用Elasticsearch Nest在一次操作中按ID删除多个文档

本文关键字:操作 ID 删除 文档 一次 Nest Elasticsearch 何使用 | 更新日期: 2023-09-27 17:59:31

我正在为我的应用程序构建一些抽象函数来调用,这将通过Nest进行弹性搜索。这样的函数之一是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批量删除文档的正确方法是什么?

如何使用Elasticsearch 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);