Как сохранить lat/lon в geo_point с незначащей ( нулевой ) дробной частью?
Доброго времени суток.
Имеется индекс с маппингом
... "location": { "type": "geo_point" }, "location_raw_coords": { "type": "text" } ... |
... "location": { "type": "geo_point" }, "location_raw_coords": { "type": "text" } ...
Имеется запись в индексе
"_source": { "id": "65f9adf90344fca3d5ddd647", "location": { "lon": 30, "lat": 20 }, "location_raw_coords": "20.0,30.0" } |
"_source": { "id": "65f9adf90344fca3d5ddd647", "location": { "lon": 30, "lat": 20 }, "location_raw_coords": "20.0,30.0" }
В location_raw_coords пишутся lat/lon через запятую as is ( поле текстовое и сделано специально для проверки ).
При попытке сохранить geo_point как {"lat": 20.0, "lon":30.0 } удаляются незначащие нули.
Каким образом можно заставить ES не удалять их при сохранении и отдавать as is в поисковых результатах?
Заранее спасибо за ответ
Дополнительно:
Ответы:
Используйте geohash.
И на подобный вопрос я отвечал лет 5 назад :)
Elasticsearch geohash — как получить данные которые были агрегированы?
Библиотек конверторов lat/lon-geihash полно на любом языке.
Упс. lat/lon это просто действительное чмсло, на любом ящыке его можно форматировать с заданной точностью. Так что думается, проблема не в эластике, а в языке программирования. Приведите число к double и все.
- geohash не подходит, данные уже нормализованы и отображаются пользователю.
Использовать geohash, а затем конвертить в человекочитаемые lat/lon в результатах выдачи ( могут быть сотни тысяч записей ) для отображения пользователю это как-то не айс.
Ну и о внезапно числах.
curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d' { "mappings": { "properties": { "location": { "type": "geo_point" } } } } ' curl -X PUT "localhost:9200/my-index-000001/_doc/1?pretty" -H 'Content-Type: application/json' -d' { "text": "Geopoint as an object with .000", "location": { "lat": 41.000, "lon": -71.000 } } '
curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d' { "mappings": { "properties": { "location": { "type": "geo_point" } } } } ' curl -X PUT "localhost:9200/my-index-000001/_doc/1?pretty" -H 'Content-Type: application/json' -d' { "text": "Geopoint as an object with .000", "location": { "lat": 41.000, "lon": -71.000 } } '
$ curl -sS 'localhost:9200/my-index-000001/_search?q=*' | jq .
$ curl -sS 'localhost:9200/my-index-000001/_search?q=*' | jq .
Упс. Число с заданной точностью ( .000 ) внезапно ES сам отформатировал, хотя его об этом не просили.
{ "took": 0, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "my-index-000001", "_type": "_doc", "_id": "1", "_score": 1, "_source": { "text": "Geopoint as an object with .000", "location": { "lat": 41, "lon": -71 } } } ] } }
{ "took": 0, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "my-index-000001", "_type": "_doc", "_id": "1", "_score": 1, "_source": { "text": "Geopoint as an object with .000", "location": { "lat": 41, "lon": -71 } } } ] } }
- Вайладион Гогназдиак, ну... тогда только программно на стороне клиента.
- Алексей Черемисин, так и сделал как временное решение. Попробую ещё покурить маны по конфигам самого ES, может там что найдется.
Спасибо за участие. - Вайладион Гогназдиак, есть еще synthetic source, но с ним, похоже, еще хуже :)
https://www.elastic.co/guide/en/elasticsearch/refe... - Алексей Черемисин, так мы до ingest pipeline дойдем ;)))))
- Вайладион Гогназдиак, Напишите им ишью, пусть не расслабляются :)
- Или валите на opensearch, там ишью чаще проходят.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для сохранения координат lat/lon в поле geo_point с нулевой дробной частью в Elasticsearch, вам необходимо использовать тип данных geohash. Geohash - это строка, представляющая широту и долготу в виде одного значения.
Вот пример того, как можно сохранить координаты с нулевой дробной частью в Elasticsearch с использованием geohash:
PUT /my_index { "mappings": { "properties": { "location": { "type": "geo_point" } } } } PUT /my_index/_doc/1 { "location": "dr5ru" }
В этом примере мы создаем индекс с маппингом для поля location типа geo_point. Затем мы добавляем документ с координатами "dr5ru", которые представляют широту и долготу с нулевой дробной частью.
При поиске по этим координатам в Elasticsearch вы можете использовать запросы, поддерживающие геолокацию, такие как geo_distance или geo_bounding_box.
Таким образом, используя geohash для сохранения координат с нулевой дробной частью в Elasticsearch, вы сможете эффективно хранить и обрабатывать географические данные.