Search code examples
c#elasticsearchnest

How to upload/index a GeoJson file in Elasticsearch using NEST(C#)


I have GeoJson File with me which i want to index on Elastic Search through NEST But Due to lack of expertise I am having trouble in indexing the document I have created a class which represent the Mapping on ElasticSearch:

public class GeoDocument
    {
        [Nest.Keyword(Name = "DocId")]
        public string DocId { get; set; }

        [Nest.GeoShape(Name = "GeoField")]
        public object GeoField { get; set; }
    }

But when i use this Mapping to index a Document


var polygon = "{\"type\":\"Polygon\",\"coordinates\":[[[5.856956,51.002753],[5.856928,51.002771],[5.856687,51.002853],[5.856956,51.002753]]]}";

var geoDocument = new GeoJson
{
   DocId = "1",
   GeoField = JsonConvert.DeserializeObject<object>(polygon)
};
var IndexResponse = client.IndexDocument(geoDocument);

I get a Result Something like This

"_source": {
                    "DocId": "1",
                    "GeoField": [
                        [
                            []
                        ],
                        [
                            [
                                [
                                    [
                                        [],
                                        []
                                    ],
                                    [
                                        [],
                                        []
                                    ],
                                    [
                                        [],
                                        []
                                    ],
                                    [
                                        [],
                                        []
                                    ]
                                ]
                            ]
                        ]
                    ]
                }
            }

Solution

  • In order to make that JObject saved correctly, you have to tell the ElasticClient to use NewtonSoft .Net serializer.

    1. Install NEST.JsonNetSerializer package
    2. Reference the JsonNetSerializer in your ConnectionSettings
    3. If you get 400 after changing the settings, you might need to create a new Index.

    Sample code

    using Nest;
    using Elasticsearch.Net;
    using Nest.JsonNetSerializer;
    
        SingleNodeConnectionPool node = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
        ConnectionSettings settings = new ConnectionSettings(
            node,
            JsonNetSerializer.Default
        );
        settings.DefaultMappingFor<GeoDocument>(m => m.IndexName("project2"));
        ElasticClient client = new ElasticClient(settings);
    
        // This is Supposed to be GeoDocument as per your question.
        GeoDocument geoDocument = new GeoDocument 
        {
            DocId = "1",
            GeoField = JObject.Parse(polygon)
            // GeoField = JsonConvert.DeserializeObject<object>(polygon) // <-- Works too.
        };
    
        IndexResponse IndexResponse = client.IndexDocument(geoDocument);
    

    Response

    {
        "took": 1,
        "timed_out": false,
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": {
                "value": 1,
                "relation": "eq"
            },
            "max_score": 1.0,
            "hits": [
                {
                    "_index": "project2",
                    "_type": "_doc",
                    "_id": "COQRXW8BNG2RJmIOyoO0",
                    "_score": 1.0,
                    "_source": {
                        "DocId": "1",
                        "GeoField": {
                            "type": "Polygon",
                            "coordinates": [
                                [
                                    [
                                        5.856956,
                                        51.002753
                                    ],
                                    [
                                        5.856928,
                                        51.002771
                                    ],
                                    [
                                        5.856687,
                                        51.002853
                                    ],
                                    [
                                        5.856956,
                                        51.002753
                                    ]
                                ]
                            ]
                        }
                    }
                }
            ]
        }
    }