地理空间搜索的 geodist() 和 dist() 之间的区别
Difference between geodist() and dist() for Geo-Spacial Search
Apache Solr 中用于地理空间搜索的 Geodist(sfield,x,y) 和 dist(2,x,y,a,b) 之间有什么区别? ?
dist(2,x,y,0,0) :- 计算每个文档的 (0,0) 和 (x,y) 之间的 欧氏距离 。 Return n维中两个向量(点)之间的距离space。
我早些时候在我的网站上使用 geodist() 距离函数进行地理空间搜索,但它的响应时间很长。所以对不同的距离函数做了POC(proof of concept),发现dist(2,x,y,0,0)距离函数相对占用了一半的时间。但我想知道这背后的原因以及这两个函数用来计算距离的算法。
我必须制作一个差异矩阵来进一步传达它。
欧氏距离不考虑地球的曲率。如果您 仅 按距离排序,则行为可能没问题 - 但前提是您的点击在一个小地理区域内(与米相比的单位值在您越来越接近两极了)。
GIS Stack Exchange 提供 an extensive and good answer that explains the difference between a Euclidean distance and a proper geographical distance(通常使用半正弦计算)。
Although at small scales any smooth surface looks like a plane, the accuracy of the Pythagorean formula depends on the coordinates used. When those coordinates are latitude and longitude on a sphere (or ellipsoid), we can expect that
- Distances along lines of longitude will be reasonably accurate.
- Distances along the Equator will be reasonably accurate.
- All other distances will be erroneous, in rough proportion to the differences in latitude and longitude.
主要区别在于 geodist()
旨在处理空间字段类型。
大多数空间实现都是基于 Lucene 的点 API,这是一个 BKD 索引。此字段类型严格限于 lat/lon 十进制度的坐标。在幕后,纬度和经度被索引为单独的数字。四种主要字段类型可用于空间搜索:
- LatLonPointSpatialField
- LatLonType(现已弃用)及其非大地测量孪生 PointType
- SpatialRecursivePrefixTreeFieldType(简称RPT),包括RptWithGeometrySpatialField,其衍生
- BBoxField(对于区域,由 numberType 引用的另一种字段类型的 4 个实例)
在 geodist (sfield, x, y)
中,sfield 是表示两个点 (lat,lon) 的空间字段类型,因此使用 dist() 的直接等效方法是实现dist (2, sfieldX, sfieldY, x, y)
sfieldX 和 sfieldY 分别是 sfield 的 (lat,lon) 坐标。
使用 dist (power, a, b, ...)
您无法查询空间字段类型。为了执行相同的空间搜索,您必须分别指定每个点的维度。对于 2 个维度,它需要 2 个索引字段(或每个字段至少 值 ),3d 需要 3 个,依此类推。这会产生巨大的差异,因为您必须分别为每个点的每个坐标编制索引。
此外,您还可以像 BBoxField
字段类型一样使用 geodist()
,该字段类型为每个文档字段索引一个矩形并支持通过边界框进行搜索。要对 dist()
做同样的事情,您必须计算框的中心点以将其每个坐标作为函数参数输入,因此如果您想使用,产生相同的结果会很麻烦区域作为参数。
最后,例如 LatLonPointSpatialField
基于 Haversine formula (Great Circle) 进行距离计算,BBoxField
的计算速度更快一些,因为矩形的计算速度更快。 dist()
确实可能更快,但请记住,这需要更多的字段进行索引,在查询时进行大量预处理才能产生相同的计算距离,而且,正如 Mats 所提到的,它不会考虑地球的曲率。
Apache Solr 中用于地理空间搜索的 Geodist(sfield,x,y) 和 dist(2,x,y,a,b) 之间有什么区别? ?
dist(2,x,y,0,0) :- 计算每个文档的 (0,0) 和 (x,y) 之间的 欧氏距离 。 Return n维中两个向量(点)之间的距离space。
我早些时候在我的网站上使用 geodist() 距离函数进行地理空间搜索,但它的响应时间很长。所以对不同的距离函数做了POC(proof of concept),发现dist(2,x,y,0,0)距离函数相对占用了一半的时间。但我想知道这背后的原因以及这两个函数用来计算距离的算法。
我必须制作一个差异矩阵来进一步传达它。
欧氏距离不考虑地球的曲率。如果您 仅 按距离排序,则行为可能没问题 - 但前提是您的点击在一个小地理区域内(与米相比的单位值在您越来越接近两极了)。
GIS Stack Exchange 提供 an extensive and good answer that explains the difference between a Euclidean distance and a proper geographical distance(通常使用半正弦计算)。
Although at small scales any smooth surface looks like a plane, the accuracy of the Pythagorean formula depends on the coordinates used. When those coordinates are latitude and longitude on a sphere (or ellipsoid), we can expect that
- Distances along lines of longitude will be reasonably accurate.
- Distances along the Equator will be reasonably accurate.
- All other distances will be erroneous, in rough proportion to the differences in latitude and longitude.
主要区别在于 geodist()
旨在处理空间字段类型。
大多数空间实现都是基于 Lucene 的点 API,这是一个 BKD 索引。此字段类型严格限于 lat/lon 十进制度的坐标。在幕后,纬度和经度被索引为单独的数字。四种主要字段类型可用于空间搜索:
- LatLonPointSpatialField
- LatLonType(现已弃用)及其非大地测量孪生 PointType
- SpatialRecursivePrefixTreeFieldType(简称RPT),包括RptWithGeometrySpatialField,其衍生
- BBoxField(对于区域,由 numberType 引用的另一种字段类型的 4 个实例)
在 geodist (sfield, x, y)
中,sfield 是表示两个点 (lat,lon) 的空间字段类型,因此使用 dist() 的直接等效方法是实现dist (2, sfieldX, sfieldY, x, y)
sfieldX 和 sfieldY 分别是 sfield 的 (lat,lon) 坐标。
使用 dist (power, a, b, ...)
您无法查询空间字段类型。为了执行相同的空间搜索,您必须分别指定每个点的维度。对于 2 个维度,它需要 2 个索引字段(或每个字段至少 值 ),3d 需要 3 个,依此类推。这会产生巨大的差异,因为您必须分别为每个点的每个坐标编制索引。
此外,您还可以像 BBoxField
字段类型一样使用 geodist()
,该字段类型为每个文档字段索引一个矩形并支持通过边界框进行搜索。要对 dist()
做同样的事情,您必须计算框的中心点以将其每个坐标作为函数参数输入,因此如果您想使用,产生相同的结果会很麻烦区域作为参数。
最后,例如 LatLonPointSpatialField
基于 Haversine formula (Great Circle) 进行距离计算,BBoxField
的计算速度更快一些,因为矩形的计算速度更快。 dist()
确实可能更快,但请记住,这需要更多的字段进行索引,在查询时进行大量预处理才能产生相同的计算距离,而且,正如 Mats 所提到的,它不会考虑地球的曲率。