没有对象名称的嵌套 DeleteByQuery

Nest DeleteByQuery without the Object name

我想在不指定我没有的对象的情况下向 elasticsearch 发送 Nest 删除请求。我见过这样的解决方案:

var response = elasticClient.DeleteByQuery<MyClass>(q => q                
            .Match(m => m.OnField(f => f.Guid).Equals(someObject.Guid))            
            );

发件人:DeleteByQuery using NEST and ElasticSearch

因为我只是从队列中读取纯文本,所以我无权访问用于删除请求的 MyClass 对象。基本上我只想删除索引(我知道其名称)中变量匹配的所有文档,例如 ordId = 1234。类似:

    var response = client.DeleteByQuery<string>( q => q
        .Index(indexName)
        .AllTypes()
        .Routing(route)
        .Query(rq => rq
            .Term("orgId", "1234"))
    );

我看到嵌套的 IElasticClient 接口确实有一个不需要映射对象的 DeleteByQuery 方法,但不确定如何实现它。

您只需将 object 指定为 DeleteByQuery<T> 的文档类型 T - 在这种情况下,只需确保明确提供要定位的索引名称和类型名称。 T 用于仅在请求正文中提供强类型访问。例如,

var client = new ElasticClient();

var deleteByQueryResponse = client.DeleteByQuery<object>(d => d
    .Index("index-name")
    .Type("type-name")
    .Query(q => q
        .Term("orgId", "1234")
    )
);

将生成以下查询

POST http://localhost:9200/index-name/type-name/_delete_by_query
{
  "query": {
    "term": {
      "orgId": {
        "value": "1234"
      }
    }
  }
}

首先将 URI 中的 _delete_by_query 替换为 _search,以确保您定位的是预期的文档:)