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

В чем разница между 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) относительно занимает половину времени. Но я хочу знать причину этого и алгоритмы, которые обе функции используют для вычисления расстояния.

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

Спасибо в ожидании.

2 ответа

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам