【问题标题】:How to delete several documents by ID in one operation using Elasticsearch Nest如何使用 Elasticsearch Nest 在一次操作中按 ID 删除多个文档
【发布时间】:2015-09-10 18:58:07
【问题描述】:

我正在构建一些抽象函数供我的应用程序调用,这些函数将通过 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批量删除文档的正确方法是什么?

【问题讨论】:

    标签: c# elasticsearch nest


    【解决方案1】:

    要使用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()
    });
    

    【讨论】:

    • 此操作后如何指定索引和类型?
    • 什么意思?如何在DeleteMany中指定索引和类型?
    • 客户端应该有类型和索引。
    【解决方案2】:

    我正在为 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2023-04-07
      • 1970-01-01
      相关资源
      最近更新 更多