javaelasticsearchresthighlevelclientelasticsearch-high-level-restclient

How can I parse a GeoPoint value out of an ElasticSearch response in Java?


I am searching an elastic search index from Java using Elastic's high level REST client for JAVA.

My response looks like this...

  {
    "took": 25,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 10000,
            "relation": "gte"
        },
        "max_score": 2,
        "hits": [
            {
                "_index": "contacts_1_rvmmtqnnlh",
                "_type": "_doc",
                "_id": "1",
                "_score": 2,
                "_source": {
                    "location": {
                        "lon": -71.34,
                        "lat": 41.12
                    }
                }
            },
            {
                "_index": "contacts_1_rvmmtqnnlh",
                "_type": "_doc",
                "_id": "5291485",
                "_score": 2,
                "_source": {
                    "home_address1": "208 E Main ST Ste 230",
                    "firstname": "Geri",
                    "home_city": "Belleville",
                    "location": "39.919499456869055,-89.08605153191894",
                    "lastname": "Boyer"
                }
            },
            ...
            {
                "_index": "contacts_1_rvmmtqnnlh",
                "_type": "_doc",
                "_id": "5291492",
                "_score": 2,
                "_source": {
                    "home_address1": "620 W High ST",
                    "firstname": "Edna",
                    "home_city": "Nashville",
                    "location": "40.55917440131824,-89.24254785283054",
                    "lastname": "Willis"
                }
            }
        ]
    }
}

How can I parse out the latitude and longitude of each document hit? The latitude and longitude are stored in a field named "location" that is of type GeoPoint

Here is what I have tried...

        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit hit : hits) {
        Map<String, Object> contactMap = hit.getSourceAsMap();
        LinkedHashMap<String, Object> contactLHM = new LinkedHashMap<>(contactMap);
        Object coordinate = contactLHM.get("location");
        location.latitude = ?????? 
        location.longitude = ????? 

}

How can I parse out the latitude and longitude given that the value of the coordinate variable is

{lon=-71.34, lat=41.12}

By the way, this is the location class definition:

    public static class Location{
    public Double latitude;
    public Double longitude;
}

Solution

  • The source here indicates that you have saved documents with different _source. You can do that with the geo_point type and of course, query them by using the same query. Basically elasticsearch understands both formats and analyzes them to the same structure (lat, lon), but that doesn't mean that it will change your source (which is exactly the data you saved).

    First of all, if that's an option, you need to save the data with only one way, so the _source comes always the same. If that's not an option then you need to handle both formats (location as string, location as object of lat and lon). Moreover, you can update your _source by script.

    https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html