ElasticSearch NEST API将值更新为null

时间:2015-01-13 09:05:27

标签: c# api elasticsearch nest

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

调用更新时是否有任何参数或设置允许通过nest api设置null

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

2 个答案:

答案 0 :(得分:7)

而不是为整个请求更改应该如何为其序列化最安全且最隔离的方法是为更新引入单独的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
  }
}

答案 1 :(得分:1)

  • 就我而言,我有一个.NET DateTime?属性,我想将ElasticSearch date属性更新为null或empty。
  • 我无法使用Doc method执行此操作。它不会将我的null赋值推送到elasticsearch(可能是因为elasticsearch date类型不支持null)。

所以这就是我所做的:

  1. 我修改了elasticsearch.yml文件以包含this settingscript.groovy.sandbox.enabled: true
  2. 我将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));