ElasticSearch NEST API 更新值为 null

Posted

技术标签:

【中文标题】ElasticSearch NEST API 更新值为 null【英文标题】:ElasticSearch NEST API update value to null 【发布时间】:2015-01-13 09:05:27 【问题描述】:

我正在使用 NEST api,但无法使用 client.Update<T, K> 方法将值更新为 null

调用 update 时是否有任何参数或设置允许通过嵌套 api 设置 null

我知道我可以理智地做到这一点。

【问题讨论】:

您找到解决方案了吗?这适用于合并更新,但如果设置将忽略空值。也许有一个选项? 似乎插入工作相同 - 忽略空值。 【参考方案1】:

与其更改应为整个请求序列化 null 的方式,最安全和最孤立的方法是为要清除的属性具有以下属性的更新引入单独的 POCO。

[JsonProperty(NullValueHandling = NullValueHandling.Include)]

示例 POCO:

// <summary>
/// This POCO models an ElasticsearchProject that allows country to serialize to null explicitly
/// So that we can use it to clear contents in the Update API
/// </summary>
public class PartialElasticsearchProjectWithNull

    [JsonProperty(NullValueHandling = NullValueHandling.Include)]
    public string Country  get; set; 

使用该 POCO 的示例更新:

var partialUpdate = new PartialElasticsearchProjectWithNull  Country = null ;

this._client.Update<ElasticsearchProject, PartialElasticsearchProjectWithNull>(update => update
    .Id(3) 
    .Doc(partialUpdate)
);

这将生成以下 JSON:


  "doc": 
    "country": null
  

【讨论】:

【参考方案2】: 就我而言,我有一个 .NET DateTime? 属性,我想将 ElasticSearch date 属性更新为 null 或空。 我无法使用Doc method。它不会将我的 null 分配推送给 elasticsearch(可能是因为 elasticsearch date 类型不支持 null)。

这就是我所做的:

    我修改了elasticsearch.yml 文件以包含this setting: script.groovy.sandbox.enabled: true

    我将我的 C# 代码修改为以下to remove the property from the document:

        _elasticClient.Update<MyIndexType, object>(u => u
            .Id(myDocumentId)
            .Index(myIndexName)
            .Type(myType)
            .Script(string.Format("ctx._source.remove(\"0\")", myPropertyName))
            .RetryOnConflict(3));
    

【讨论】:

以上是关于ElasticSearch NEST API 更新值为 null的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NEST 更新 ElasticSearch 索引中的现有文档?

如何使用NEST Bulk Api将文档添加到elasticsearch

使用 NEST (ElasticSearch) 插入文档

如何使用 elasticsearch nest api 创建自定义分析器以忽略重音和 pt-br 停用词?

如何在 C# Nest 中将日期值发送到 elasticsearch 聚合查询

使用 NEST 索引动态对象