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

How can I delete a field value from an Elasticsearch document using NEST?

我正在使用 Nest 来 insert/update Elasticsearch 中的文档。这是我用来映射文档的示例 POCO class...

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

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

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

我正在使用部分文档更新,如果可能的话,我希望保持这样。 (我使用的完整文档模型将有 100 多个字段,我的索引最终将有 1 亿多条记录。)因此,我正在寻找部分更新文档的最有效方法。

提前致谢!

想一想,仅使用 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')")));