elasticsearch,.net-core,nest,C#,elasticsearch,.net Core,Nest" /> elasticsearch,.net-core,nest,C#,elasticsearch,.net Core,Nest" />

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

C# 如何使用NEST从Elasticsearch文档中删除字段值?,c#,elasticsearch,.net-core,nest,C#,elasticsearch,.net Core,Nest,我正在使用Nest在Elasticsearch中插入/更新文档。下面是一个示例POCO类,我使用它来映射文档 public class MyClass { public string Id { get; set; } public decimal? MyField { get; set; } } 这正如预期的那样工作……当我添加文档时,如果可为空的字段MyField有一个值,它将在JSON中返回。如果可空字段没有值,则不会在\u sourceJSON中返回它,因为不存储空值 但

我正在使用Nest在Elasticsearch中插入/更新文档。下面是一个示例POCO类,我使用它来映射文档

public class MyClass
{
    public string Id { get; set; }
    public decimal? MyField { get; set; }
}
这正如预期的那样工作……当我添加文档时,如果可为空的字段
MyField
有一个值,它将在JSON中返回。如果可空字段没有值,则不会在
\u source
JSON中返回它,因为不存储空值

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

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


提前谢谢

想一想,仅仅使用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版本
按查询发布我的索引/更新
{
“查询”:{
“ID”:{
“价值观”:[
"12345"
]
}
},
“脚本”:{
“源”:“ctx.\u source.myField=null”
}
}
//嵌套版本
var response=client.UpdateByQuery(u=>u
.Query(q=>q
.Ids(i=>i.Values(12345))
)
.Script(“ctx.\u source.flag=null”)
//.冲突(冲突。继续)
.刷新(真)
);
或者这个:

// 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')")));
//kibana版本
发布我的索引/我的类型/12345/\u更新
{
“脚本”:{
“源”:“ctx.\u source.remove('myField')”
}
}
//嵌套版本
var response=client.Update(
新的UpdateDescriptor(“索引名称”,“类型”,12345)
.Script(s=>s.Source(“ctx.\u Source.remove('middleName'))));

想想,如果只使用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版本
按查询发布我的索引/更新
{
“查询”:{
“ID”:{
“价值观”:[
"12345"
]
}
},
“脚本”:{
“源”:“ctx.\u source.myField=null”
}
}
//嵌套版本
var response=client.UpdateByQuery(u=>u
.Query(q=>q
.Ids(i=>i.Values(12345))
)
.Script(“ctx.\u source.flag=null”)
//.冲突(冲突。继续)
.刷新(真)
);
或者这个:

// 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')")));
//kibana版本
发布我的索引/我的类型/12345/\u更新
{
“脚本”:{
“源”:“ctx.\u source.remove('myField')”
}
}
//嵌套版本
var response=client.Update(
新的UpdateDescriptor(“索引名称”,“类型”,12345)
.Script(s=>s.Source(“ctx.\u Source.remove('middleName'))));