我正在使用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 +记录。)因此,我正在寻找最有效的方式来部分更新文档。
谢谢!
答案 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')")));