Как я могу разобрать значение GeoPoint из ответа ElasticSearch в Java? - PullRequest
1 голос
/ 03 апреля 2020

Я ищу поисковый индекс elasti c из Java, используя REST-клиент высокого уровня Elasti c для JAVA.

Мой ответ выглядит следующим образом ...

  {
    "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"
                }
            }
        ]
    }
}

Как я могу разобрать широту и долготу каждого попадания документа? Широта и долгота хранятся в поле с именем «location» типа GeoPoint

. Вот что я пробовал ...

        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 = ????? 

}

Как могу ли я разобрать широту и долготу, учитывая, что значение переменной координат

{lon = -71.34, lat = 41.12}

Кстати, это это определение класса местоположения:

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

1 Ответ

1 голос
/ 03 апреля 2020

Источник указывает, что вы сохранили документы с другим источником _. Вы можете сделать это с типом geo_point и, конечно, запросить их, используя тот же запрос. В основном эластичный поиск понимает оба формата и анализирует их в одной и той же структуре (широта, долгота), но это не значит, что он изменит ваш источник (который в точности соответствует сохраненным данным).

Прежде всего, если это вариант, вам нужно сохранить данные только одним способом, поэтому источник _ всегда остается одним и тем же. Если это не вариант, вам нужно обрабатывать оба формата (местоположение как строка, местоположение как объект lat и lon). Кроме того, вы можете обновить свой _источник по сценарию.

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

...