Разница между geodist() и dist() для геопространственного поиска

В чем разница между Geodist(sfield,x,y) и dist(2,x,y,a,b) в Apache Solr для геопространственного поиска??

dist(2,x,y,0,0): - вычисляет евклидово расстояние между (0,0) и (x,y) для каждого документа. Возвращает Расстояние между двумя Векторами (точками) в n-мерном пространстве.

Ранее я использовал функцию расстояния geodist() для геопространственного поиска на своем веб-сайте, но время ее отклика было большим. поэтому мы сделали POC (доказательство концепции) для различных функций расстояния и обнаружили, что функция расстояния dist(2,x,y,0,0) относительно занимает половину времени. Но я хочу знать причину этого и алгоритмы, которые обе функции используют для расчета расстояния.

Я должен сделать матрицу различий для того же, чтобы передать это дальше.


person Divyansh Goel    schedule 07.12.2017    source источник


Ответы (2)


Основное отличие состоит в том, что geodist() предназначен для работы с пространственными типами полей.

Большинство пространственных реализаций основаны на Lucene Points API, который представляет собой индекс BKD. Этот тип поля строго ограничен координатами в десятичных градусах широты/долготы. За кулисами широта и долгота индексируются как отдельные числа. Для пространственного поиска доступны четыре основных типа полей:

  • LatLonPointSpatialField
  • LatLonType (устарел) и его негеодезический двойник PointType
  • SpatialRecursivePrefixTreeFieldType (сокращенно RPT), включая RptWithGeometrySpatialField, производное
  • BBoxField (для областей, 4 экземпляра другого типа поля, на который ссылается numberType)

В geodist (sfield, x, y) sfield — это тип пространственного поля, который представляет две точки (широта, долгота), поэтому прямым эквивалентом использования dist() будет реализация dist (2, sfieldX, sfieldY, x, y) с sfieldX и sfieldY соответственно (широта, долгота). ) координаты поля.

Используя dist (power, a, b, ...), вы не можете запрашивать тип пространственного поля. Чтобы выполнить такой же пространственный поиск, вам нужно было бы указать размер каждой точки отдельно. Для этого потребуется 2 проиндексированных поля (или как минимум значения для каждого поля) для 2 измерений, 3 для 3d и так далее. Это имеет огромное значение, потому что вам придется индексировать каждую координату каждой точки отдельно.

Кроме того, вы также можете использовать geodist() как есть с типом поля BBoxField, который индексирует один прямоугольник для каждого поля документа и поддерживает поиск через ограничивающую рамку. Чтобы сделать то же самое с dist(), вам нужно будет вычислить центральную точку блока, чтобы ввести каждую из его координат в качестве аргумента функции, поэтому было бы слишком много хлопот, чтобы получить тот же результат, если вы хотите использовать область в качестве параметра.

Наконец, LatLonPointSpatialField например, вычисляет расстояние на основе формулы Хаверсина (большой круг), BBoxField делает это немного быстрее, потому что прямоугольная форма вычисляется быстрее. Это правда, что dist() может быть даже быстрее, но помните, что для этого требуется больше полей для индексации, много предварительной обработки во время запроса, чтобы иметь возможность получить такое же вычисленное расстояние, и, как упоминал Матс, это не займет земли ' с учетом кривизны.

person EricLavault    schedule 07.12.2017

Евклидово расстояние не учитывает кривизну Земли. Если вы только сортируете по расстоянию, поведение может быть нормальным, но только если ваши попадания находятся в пределах небольшой географической области (значение единицы по сравнению с метрами сильно меняется, когда вы получаете ближе к полюсам).

Существует обширный и хороший ответ, который объясняет разницу между евклидовым расстоянием и правильным географическим расстоянием (обычно рассчитывается с использованием гаверсинуса), доступный на GIS Stack Exchange.

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

  • Расстояния вдоль линий долготы будут достаточно точными.
  • Расстояния вдоль экватора будут достаточно точными.
  • Все остальные расстояния будут ошибочными, примерно пропорционально разнице в широте и долготе.
person MatsLindh    schedule 07.12.2017