如何通过NEST在Elastic中按自定义type字段批量删除文档?
解决方案
背景说明
Elasticsearch 7.x及后续版本正式废弃了内置映射类型(_type),对应版本的NEST客户端也移除了DeleteDescriptor里的Type()方法。你现在使用的type是文档自定义的业务字段,按以下两种场景实现需求:
场景1:已获取待删文档ID,使用BulkDeleteDescriptor批量删除
Bulk接口的删除操作本身基于索引+文档ID定位文档,写法如下:
var bulkDescriptor = new BulkDescriptor(); // 示例:待删数据列表,包含文档ID和自定义type值 var deleteItems = new List<(string DocId, string CustomType)>() { ("someId", "action"), ("id2", "novel") }; foreach (var item in deleteItems) { bulkDescriptor.Delete<object>(d => d .Index("testIndex") .Id(item.DocId) ); } // 执行批量删除 var bulkResponse = elasticClient.Bulk(bulkDescriptor); // 结果校验 if (!bulkResponse.IsValid) { // 处理错误逻辑,可通过 bulkResponse.ServerError 查看报错详情 }
注意:如果需要避免误删同ID但自定义type不匹配的文档,可以先执行查询筛选出符合type+其他条件的文档ID,再传入上述批量删除逻辑。
场景2:未获取ID,直接按自定义type+其他条件删除
如果不需要提前查询ID,直接按字段条件批量删除的场景,使用DeleteByQuery接口效率更高,无需走Bulk流程:
var deleteResponse = elasticClient.DeleteByQuery<object>(d => d .Index("testIndex") .Query(q => q .Bool(b => b .Must( // 匹配自定义type字段 t => t.Term(f => f.Field("type").Value("action")), // 其他筛选条件,示例为匹配指定ID列表 i => i.Ids(f => f.Values("someId", "anotherId")) ) ) ) );
提示:如果有定义对应文档的POCO类,可以把泛型参数
<object>替换为你的实体类,字段名支持用lambda强类型指定,避免硬编码错误。
内容的提问来源于stack exchange,提问作者sm0keman1
相关产品推荐
相关产品推荐

