Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BUG JsonNetSerializer doesn't work for GeoLocation #3981

Closed
horizondave opened this issue Aug 1, 2019 · 3 comments
Closed

BUG JsonNetSerializer doesn't work for GeoLocation #3981

horizondave opened this issue Aug 1, 2019 · 3 comments

Comments

@horizondave
Copy link

horizondave commented Aug 1, 2019

I had this as my configuration:
var connSettings = new ConnectionSettings(pool, sourceSerializer: (builtin, settings) => new JsonNetSerializer( builtin, settings, () => new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore } )) ...

Using the JsonNetSerializer DOES NOT serialize latitude and longitude properties of GeoPoint as "lat" and "lng", so every IndexDocument request fails.

`Unsuccessful low level call on PUT: /test_sites/site/123?pretty=true&error_trace=true
Audit trail of this API call:

  • [1] BadResponse: Node: http://localhost:9200/ Took: 00:00:00.0919641
    OriginalException: Elasticsearch.Net.ElasticsearchClientException: The remote server returned an error: (400) Bad Request.. Call: Status code 400 from: PUT /test_sites/site/123?pretty=true&error_trace=true. ServerError: Type: mapper_parsing_exception Reason: "failed to parse field [location] of type [geo_point]" CausedBy: "Type: parse_exception Reason: "field must be either [lat], [lon] or [geohash]"" ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.
    at System.Net.HttpWebRequest.GetResponse()
    at Elasticsearch.Net.HttpWebRequestConnection.Request[TResponse](RequestData requestData)
    --- End of inner exception stack trace ---

Request:

{
"id": 123,
"name": "Daves Dummy Site",
"masterKey": "Master123abc",
"postalZipCode": "PE13 4EB",
"location": {
"latitude": 52.60862,
"longitude": 0.05959
},
"organisationId": 10001,
"organisationName": "Organisation Dummy",
"region": "East",
"country": "England",
"isActive": true
}

Response:

{
"error" : {
"root_cause" : [
{
"type" : "parse_exception",
"reason" : "field must be either [lat], [lon] or [geohash]",
"stack_trace" : "ElasticsearchParseException[field must be either [lat], [lon] or [geohash]]\r\n\tat org.elasticsearch.common.geo.GeoUtils.parseGeoPoint(GeoUtils.java:459)\r\n\tat org.elasticsearch.common.geo.GeoUtils.parseGeoPoint(GeoUtils.java:365)\r\n\tat org.elasticsearch.index.mapper.GeoPointFieldMapper.parseGeoPointIgnoringMalformed(GeoPointFieldMapper.java:358)\r\n\tat org.elasticsearch.index.mapper.GeoPointFieldMapper.parse(GeoPointFieldMapper.java:343)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:488)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:505)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.innerParseObject(DocumentParser.java:395)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObjectOrNested(DocumentParser.java:384)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.internalParseDocument(DocumentParser.java:96)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:69)\r\n\tat org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:281)\r\n\tat org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:799)\r\n\tat org.elasticsearch.index.shard.IndexShard.applyIndexOperation(IndexShard.java:775)\r\n\tat org.elasticsearch.index.shard.IndexShard.applyIndexOperationOnPrimary(IndexShard.java:744)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.lambda$executeIndexRequestOnPrimary$3(TransportShardBulkAction.java:458)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeOnPrimaryWhileHandlingMappingUpdates(TransportShardBulkAction.java:481)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeIndexRequestOnPrimary(TransportShardBulkAction.java:456)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeBulkItemRequest(TransportShardBulkAction.java:220)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.performOnPrimary(TransportShardBulkAction.java:164)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.performOnPrimary(TransportShardBulkAction.java:156)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:143)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:82)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:1059)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:1037)\r\n\tat org.elasticsearch.action.support.replication.ReplicationOperation.execute(ReplicationOperation.java:104)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.runWithPrimaryShardReference(TransportReplicationAction.java:433)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.lambda$doRun$0(TransportReplicationAction.java:374)\r\n\tat org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61)\r\n\tat org.elasticsearch.index.shard.IndexShard.lambda$wrapPrimaryOperationPermitListener$14(IndexShard.java:2586)\r\n\tat org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61)\r\n\tat org.elasticsearch.index.shard.IndexShardOperationPermits.acquire(IndexShardOperationPermits.java:273)\r\n\tat org.elasticsearch.index.shard.IndexShardOperationPermits.acquire(IndexShardOperationPermits.java:240)\r\n\tat org.elasticsearch.index.shard.IndexShard.acquirePrimaryOperationPermit(IndexShard.java:2561)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction.acquirePrimaryOperationPermit(TransportReplicationAction.java:996)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.doRun(TransportReplicationAction.java:370)\r\n\tat org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:325)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:312)\r\n\tat org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:66)\r\n\tat org.elasticsearch.transport.TransportService$7.doRun(TransportService.java:692)\r\n\tat org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:751)\r\n\tat org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\r\n\tat java.lang.Thread.run(Thread.java:748)\r\n"
}
],
"type" : "mapper_parsing_exception",
"reason" : "failed to parse field [location] of type [geo_point]",
"caused_by" : {
"type" : "parse_exception",
"reason" : "field must be either [lat], [lon] or [geohash]",
"stack_trace" : "ElasticsearchParseException[field must be either [lat], [lon] or [geohash]]\r\n\tat org.elasticsearch.common.geo.GeoUtils.parseGeoPoint(GeoUtils.java:459)\r\n\tat org.elasticsearch.common.geo.GeoUtils.parseGeoPoint(GeoUtils.java:365)\r\n\tat org.elasticsearch.index.mapper.GeoPointFieldMapper.parseGeoPointIgnoringMalformed(GeoPointFieldMapper.java:358)\r\n\tat org.elasticsearch.index.mapper.GeoPointFieldMapper.parse(GeoPointFieldMapper.java:343)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:488)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:505)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.innerParseObject(DocumentParser.java:395)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObjectOrNested(DocumentParser.java:384)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.internalParseDocument(DocumentParser.java:96)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:69)\r\n\tat org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:281)\r\n\tat org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:799)\r\n\tat org.elasticsearch.index.shard.IndexShard.applyIndexOperation(IndexShard.java:775)\r\n\tat org.elasticsearch.index.shard.IndexShard.applyIndexOperationOnPrimary(IndexShard.java:744)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.lambda$executeIndexRequestOnPrimary$3(TransportShardBulkAction.java:458)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeOnPrimaryWhileHandlingMappingUpdates(TransportShardBulkAction.java:481)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeIndexRequestOnPrimary(TransportShardBulkAction.java:456)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeBulkItemRequest(TransportShardBulkAction.java:220)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.performOnPrimary(TransportShardBulkAction.java:164)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.performOnPrimary(TransportShardBulkAction.java:156)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:143)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:82)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:1059)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:1037)\r\n\tat org.elasticsearch.action.support.replication.ReplicationOperation.execute(ReplicationOperation.java:104)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.runWithPrimaryShardReference(TransportReplicationAction.java:433)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.lambda$doRun$0(TransportReplicationAction.java:374)\r\n\tat org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61)\r\n\tat org.elasticsearch.index.shard.IndexShard.lambda$wrapPrimaryOperationPermitListener$14(IndexShard.java:2586)\r\n\tat org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61)\r\n\tat org.elasticsearch.index.shard.IndexShardOperationPermits.acquire(IndexShardOperationPermits.java:273)\r\n\tat org.elasticsearch.index.shard.IndexShardOperationPermits.acquire(IndexShardOperationPermits.java:240)\r\n\tat org.elasticsearch.index.shard.IndexShard.acquirePrimaryOperationPermit(IndexShard.java:2561)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction.acquirePrimaryOperationPermit(TransportReplicationAction.java:996)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.doRun(TransportReplicationAction.java:370)\r\n\tat org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:325)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:312)\r\n\tat org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:66)\r\n\tat org.elasticsearch.transport.TransportService$7.doRun(TransportService.java:692)\r\n\tat org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:751)\r\n\tat org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\r\n\tat java.lang.Thread.run(Thread.java:748)\r\n"
},
"stack_trace" : "MapperParsingException[failed to parse field [location] of type [geo_point]]; nested: ElasticsearchParseException[field must be either [lat], [lon] or [geohash]];\r\n\tat org.elasticsearch.index.mapper.GeoPointFieldMapper.parse(GeoPointFieldMapper.java:347)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObjectOrField(DocumentParser.java:488)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObject(DocumentParser.java:505)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.innerParseObject(DocumentParser.java:395)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseObjectOrNested(DocumentParser.java:384)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.internalParseDocument(DocumentParser.java:96)\r\n\tat org.elasticsearch.index.mapper.DocumentParser.parseDocument(DocumentParser.java:69)\r\n\tat org.elasticsearch.index.mapper.DocumentMapper.parse(DocumentMapper.java:281)\r\n\tat org.elasticsearch.index.shard.IndexShard.prepareIndex(IndexShard.java:799)\r\n\tat org.elasticsearch.index.shard.IndexShard.applyIndexOperation(IndexShard.java:775)\r\n\tat org.elasticsearch.index.shard.IndexShard.applyIndexOperationOnPrimary(IndexShard.java:744)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.lambda$executeIndexRequestOnPrimary$3(TransportShardBulkAction.java:458)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeOnPrimaryWhileHandlingMappingUpdates(TransportShardBulkAction.java:481)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeIndexRequestOnPrimary(TransportShardBulkAction.java:456)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.executeBulkItemRequest(TransportShardBulkAction.java:220)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.performOnPrimary(TransportShardBulkAction.java:164)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.performOnPrimary(TransportShardBulkAction.java:156)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:143)\r\n\tat org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:82)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:1059)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryShardReference.perform(TransportReplicationAction.java:1037)\r\n\tat org.elasticsearch.action.support.replication.ReplicationOperation.execute(ReplicationOperation.java:104)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.runWithPrimaryShardReference(TransportReplicationAction.java:433)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.lambda$doRun$0(TransportReplicationAction.java:374)\r\n\tat org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61)\r\n\tat org.elasticsearch.index.shard.IndexShard.lambda$wrapPrimaryOperationPermitListener$14(IndexShard.java:2586)\r\n\tat org.elasticsearch.action.ActionListener$1.onResponse(ActionListener.java:61)\r\n\tat org.elasticsearch.index.shard.IndexShardOperationPermits.acquire(IndexShardOperationPermits.java:273)\r\n\tat org.elasticsearch.index.shard.IndexShardOperationPermits.acquire(IndexShardOperationPermits.java:240)\r\n\tat org.elasticsearch.index.shard.IndexShard.acquirePrimaryOperationPermit(IndexShard.java:2561)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction.acquirePrimaryOperationPermit(TransportReplicationAction.java:996)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$AsyncPrimaryAction.doRun(TransportReplicationAction.java:370)\r\n\tat org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:325)\r\n\tat org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:312)\r\n\tat org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:66)\r\n\tat org.elasticsearch.transport.TransportService$7.doRun(TransportService.java:692)\r\n\tat org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:751)\r\n\tat org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\r\n\tat java.lang.Thread.run(Thread.java:748)\r\nCaused by: ElasticsearchParseException[field must be either [lat], [lon] or [geohash]]\r\n\tat org.elasticsearch.common.geo.GeoUtils.parseGeoPoint(GeoUtils.java:459)\r\n\tat org.elasticsearch.common.geo.GeoUtils.parseGeoPoint(GeoUtils.java:365)\r\n\tat org.elasticsearch.index.mapper.GeoPointFieldMapper.parseGeoPointIgnoringMalformed(GeoPointFieldMapper.java:358)\r\n\tat org.elasticsearch.index.mapper.GeoPointFieldMapper.parse(GeoPointFieldMapper.java:343)\r\n\t... 41 more\r\n"
},
"status" : 400
}
`

@russcam
Copy link
Contributor

russcam commented Aug 1, 2019

What version of NEST are you using, and what version of Elasticsearch are you targeting?

@horizondave
Copy link
Author

Sorry,
NEST 6.8.1, ElasticSearch 6.8.1

russcam added a commit that referenced this issue Aug 7, 2019
This commit adds GeoLocation to types handled by the internal serializer so that
a property on a document POCO of type GeoLocation is serialized by the internal serializer.

It's not possible with the current test configuration to test this scenario, because
IL rewriting happens after unit tests are run, so the Json.NET constructs used on Nest types
are recognised by the JsonNetSerializer. Have added test that _would_ test behaviour, should
tests be run after IL-merging in the future.

Fixes #3981
@russcam
Copy link
Contributor

russcam commented Aug 7, 2019

I've opened #3997 to address

Mpdreamz pushed a commit that referenced this issue Aug 9, 2019
This commit adds GeoLocation to types handled by the internal serializer so that
a property on a document POCO of type GeoLocation is serialized by the internal serializer.

It's not possible with the current test configuration to test this scenario, because
IL rewriting happens after unit tests are run, so the Json.NET constructs used on Nest types
are recognised by the JsonNetSerializer. Have added test that _would_ test behaviour, should
tests be run after IL-merging in the future.

Fixes #3981
Mpdreamz pushed a commit that referenced this issue Aug 9, 2019
This commit adds GeoLocation to types handled by the internal serializer so that
a property on a document POCO of type GeoLocation is serialized by the internal serializer.

It's not possible with the current test configuration to test this scenario, because
IL rewriting happens after unit tests are run, so the Json.NET constructs used on Nest types
are recognised by the JsonNetSerializer. Have added test that _would_ test behaviour, should
tests be run after IL-merging in the future.

Fixes #3981

(cherry picked from commit 623c724)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants