【问题标题】:Nest DeleteByQuery without the Object name嵌套没有对象名称的 DeleteByQuery
【发布时间】:2018-08-06 21:55:08
【问题描述】:

我想在不指定我没有的对象的情况下向 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 方法,它不需要映射对象,但不知道如何实现它。

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    您可以将object 指定为T 的文档类型DeleteByQuery&lt;T&gt; - 在这种情况下,请务必明确提供要定位的索引名称和类型名称。 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,以确保您定位到预期的文档 :)

    【讨论】:

    • 太棒了,感谢您的详细回复。您提到明确提到索引名称和类型名称,如果我想定位与该字段匹配的所有文档类型,我可以使用 .AllTypes() 而不是 .Type("type-name")。
    • @CorribView 是的,你可以:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多