Aman B
Aman B

Reputation: 2388

Elastic search update fails after including null values

We recently upgraded to elastic search v5 and nest v5.6

We are trying to set a field to null, however, the default serialization settings are ignoring null values.

var pool = new SingleNodeConnectionPool(new Uri("http://local:9200"));

var connectionSettings =
    new ConnectionSettings(pool)
    .DisableDirectStreaming();

var elasticClient = new ElasticClient(connectionSettings);

var indexName = "myIndexName";
var typeName = "myTypeName";
var documentId = 2;

var pendingDescriptor = new BulkDescriptor();
pendingDescriptor.Index(indexName).Type(typeName);

var pendingUpdate = new Dictionary<string, object>
            {
                { $"DocumentType_TAG_PENDING_Id", null }
            };

var updateRequest = new UpdateRequest<dynamic, dynamic>(indexName, typeName, new Id(documentId));
updateRequest.Doc = pendingUpdate;
elasticClient.Update<dynamic>(updateRequest);

This results in the request:

{"update":{"_id":2,"_retry_on_conflict":3}}
{"doc":{}}

The field value isn't set to null

I tried to modify the serializer to include null values after reading here https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/modifying-default-serializer.html

var connectionSettings =
    new ConnectionSettings(pool, connection, new SerializerFactory((settings, values) =>
    {
        settings.NullValueHandling = NullValueHandling.Include;
    }));

Now my request becomes:

{"update":{"_index":null,"_type":null,"_id":2,"_version":null,"_version_type":null,"_routing":null,"_parent":null,"_timestamp":null,"_ttl":null,"_retry_on_conflict":3}}
{"doc":{"DocumentType_TAG_PENDING_Id":null},"upsert":null,"doc_as_upsert":null,"script":null,"scripted_upsert":null}

And I get the following error:

{"error":{"root_cause":[{"type":"json_parse_exception","reason":"Current token (VALUE_NULL) not of boolean type\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@181f5854; line: 1, column: 82]"}],"type":"json_parse_exception","reason":"Current token (VALUE_NULL) not of boolean type\n at [Source: org.elasticsearch.transport.netty4.ByteBufStreamInput@181f5854; line: 1, column: 82]"},"status":500}

Please help

Upvotes: 0

Views: 1210

Answers (1)

Aman B
Aman B

Reputation: 2388

So far, we have two options:

  1. Upgrade to v6, where they have separated document and request serializers. So we can customize the way our documents are serialized without affecting the request/response headers. For more info see https://www.elastic.co/guide/en/elasticsearch/client/net-api/master/custom-serialization.html

  2. Use the elastic search low-level client with post request avoid the nest serializer. https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/elasticsearch-net.html

Our preferred way will be to go with the upgrade if everything works and revert to low-level client if any issues

Upvotes: 1

Related Questions