如何使用 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')")));
我正在使用 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')")));