如何使用NEST从Elasticsearch文档中删除字段值?

时间:2018-11-30 21:15:21

标签: c# elasticsearch .net-core nest

我正在使用Nest在Elasticsearch中插入/更新文档。这是我用来映射文档的示例POCO类。

public class MyClass
{
    public string Id { get; set; }
    public decimal? MyField { get; set; }
}

这可以按预期工作...当我添加文档时,如果可为空的字段MyField有一个值,它将在JSON中返回。如果可为空的字段没有值,则不会存储在_source JSON中,因为不会存储空值。

但是,有时候我可能需要更新单个文档并从单个字段中删除值。也就是说,当我第一次插入文档时,MyField有一个值,并在Elasticsearch JSON结果中返回。然后,无论出于何种原因,我都需要删除该值。

我正在使用部分文档更新,并且如果可能的话,希望保持这种状态。 (我正在使用的完整文档模型将具有100多个字段,而我的索引最终将具有100M +记录。)因此,我正在寻找最有效的方式来部分更新文档。

谢谢!

1 个答案:

答案 0 :(得分:0)

想想如何仅使用api就可以做到?有几种方法。例如这样的

// kibana version
POST my_index/_update_by_query
{
  "query": {
    "ids": {
      "values": [
        "12345"
      ]
    }
  },
  "script": {
    "source": "ctx._source.myField = null"
  }
}

// nest version
var response = client.UpdateByQuery<CustomerDto>(u => u
    .Query(q => q
        .Ids(i => i.Values(12345))
    )
    .Script("ctx._source.flag = null")
    //.Conflicts(Conflicts.Proceed)
    .Refresh(true)
);

或者这个:

// kibana version
POST my_index/my_type/12345/_update
{
  "script": {
    "source": "ctx._source.remove('myField')"
  }
}

// nest version
var response = client.Update<CustomerDto>(
    new UpdateDescriptor<CustomerDto, CustomerDto>("index_name", "type", 12345)
        .Script(s => s.Source("ctx._source.remove('middleName')")));