Основное отличие состоит в том, что 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