Как сохранить lat/lon в geo_point с незначащей ( нулевой ) дробной частью?

Ссылка скопирована
1 ответ

Доброго времени суток.
Имеется индекс с маппингом

... "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, там ишью чаще проходят.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

Для сохранения координат 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"
}

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, вы сможете эффективно хранить и обрабатывать географические данные.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно