Apache Solr中用于地理空间搜索的Geodist(sfield,x,y)和dist(2,x,y,a,b)之间的差异

时间:2017-12-07 07:53:12

标签: solr geospatial solr6

Apache Solr中用于地理空间搜索的 Geodist(sfield,x,y)和dist(2,x,y,a,b)之间的区别是什么?

dist(2,x,y,0,0): - 为每个文档计算(0,0)和(x,y)之间的欧几里德距离。返回n维空间中两个向量(点)之间的距离。

我之前在我的网站上使用 geodist()距离函数进行地理空间搜索,但响应时间很长。所以对不同的距离函数进行了POC(概念验证),发现 dist(2,x,y,0,0)距离函数相对占用了一半的时间。但我想知道这背后的原因以及两个函数用于计算距离的算法。

我必须为它做一个差异矩阵以进一步传达它。

感谢Anticipation。

2 个答案:

答案 0 :(得分:2)

欧氏距离不考虑地球的曲率。如果您只按 按距离排序,行为就可以了 - 但只有当您的点击量位于一个较小的地理区域内时(单位的价值与米相比会大大改变,当您获得靠近两极)。

GIS Stack Exchange提供an extensive and good answer that explains the difference between a Euclidean distance and a proper geographical distance(通常使用hasrsine计算)。

  

虽然在小尺度上任何光滑表面看起来像一个平面,毕达哥拉斯公式的精确度取决于所使用的坐标。当这些坐标是球体(或椭圆体)上的纬度和经度时,我们可以期待

     
      
  • 沿经度线的距离将相当准确。
  •   
  • 赤道上的距离相当准确。
  •   
  • 所有其他距离都是错误的,与纬度和经度的差异大致成比例。
  •   

答案 1 :(得分:2)

主要区别在于geodist()旨在处理空间字段类型。

大多数空间实现都基于Lucene的Points 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和sfi​​eldY分别是sfield的(lat,lon)坐标。

使用dist (power, a, b, ...)您无法查询空间字段类型。要执行相同的空间搜索,您必须分别指定每个点的维度。对于2维,它需要2个索引字段(或至少每个字段的),3表示3,依此类推。这会产生巨大的差异,因为您必须分别索引每个点的每个坐标。

此外,您还可以geodist()使用BBoxField字段类型,该字段类型为每个文档字段索引单个矩形,并支持通过边界框进行搜索。要对dist()执行相同操作,您必须计算框的中心点以将其每个坐标作为函数参数输入,因此如果要使用它会产生相同的结果会太麻烦一个区域作为参数。

最后,LatLonPointSpatialField例如基于Haversine formula (Great Circle)的距离计算,BBoxField会更快一些,因为矩形形状的计算速度更快。确实dist()可能更快,但记住需要更多的字段进行索引,在查询时需要大量的预处理才能产生相同的计算距离,并且如Mats所述,它不会把地球的曲率考虑在内。