【问题标题】:How can I delete a field value from an Elasticsearch document using NEST?如何使用 NEST 从 Elasticsearch 文档中删除字段值?
【发布时间】:2019-05-03 01:12:44
【问题描述】:

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

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

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

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

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

提前致谢!

【问题讨论】:

    标签: c# elasticsearch .net-core nest


    【解决方案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')")));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多