问题
I am using NEST api and I am having trouble using client.Update<T, K> method to update a value to null
Is there any parameter or settings when calling update that will allow for null to be set trough nest api?
I know I can do it with sense.
回答1:
Rather then changing how null should be serialised for the entire request the safest and most isolated way to do this is to introduce a separate POCO for the update where the property you want to clear has the following attribute.
[JsonProperty(NullValueHandling = NullValueHandling.Include)]
Example 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; }
}
Example update using that POCO:
var partialUpdate = new PartialElasticsearchProjectWithNull { Country = null };
this._client.Update<ElasticsearchProject, PartialElasticsearchProjectWithNull>(update => update
.Id(3)
.Doc(partialUpdate)
);
which will generate the following JSON:
{
"doc": {
"country": null
}
}
回答2:
- In my case, I had a .NET
DateTime?property, and I wanted to update an ElasticSearchdateproperty to either null or empty. - I couldn't do it with the Doc method. It wouldn't push my null assignment to elasticsearch (probably because the elasticsearch
datetype doesn't support null).
So here's what I did:
- I modified the
elasticsearch.ymlfile to include this setting:script.groovy.sandbox.enabled: true. I modified my C# code to the following 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));
来源:https://stackoverflow.com/questions/27918354/elasticsearch-nest-api-update-value-to-null