Solr 3.4 Geodist 功能,不正确/或不需要的结果
Posted
技术标签:
【中文标题】Solr 3.4 Geodist 功能,不正确/或不需要的结果【英文标题】:Solr 3.4 Geodist function, incorrect/ or unwanted results 【发布时间】:2011-12-05 11:12:12 【问题描述】:我遇到了 Solr 3.4 的问题,我正在使用它的空间搜索功能,例如 Geodist 和 Geofilt。 一切似乎都正常,返回的结果应该是按给定中心点的距离排序的。
但是,由于 Solr 3.4 缺乏返回函数结果数据的能力,我不得不手动计算(在本例中是通过 php)。
我阅读了文档,并且 geodist 应该是一个实现 haversine 2 lat/lng 点之间地理距离函数的函数。我将该函数移植到 PHP(很简单!),并确保它给出正确的结果。
问题是:Solr 用我找不到的不同公式计算距离。因此,当我在 PHP 中重新计算距离时,它会导致数据距离不一致(例如 132 英里而不是 83 英里),这不是我可以容忍的差异。
我的解决方案:我说好的,创建一个函数比较来查看我是否在数据端口中犯了错误很方便,我挖掘了Solr code并提取了hassine的文字实现在org.apache.solr.search.function.distance.HaversineConstFunction
中,结果几乎相同。并制作了这个testing script (full source code and data)。
我的结论是 Solr(或 Lucene)不使用 hasrsine 作为 geodist 实现。但我不知道是哪个方程。
更新错误已解决。我认为我的测试走得太远了。 incorrect 结果是由于参数命名错误,我使用order
(来自 SQL 的那个)而不是sort
(Solr 约定)来更改 Solr 网络结果的顺序-服务。
【问题讨论】:
您确定不是简单地获得了正确的数字并使用了错误的单位吗? 83 英里至少约为 132 公里。 继续使用 jarnbjo,我在 Haversine 中看到的最常见错误是 1) 忘记将纬度/经度从度数转换为弧度,以及 2) 没有意识到地球半径的单位是输出距离单位。您在 Haversine 公式中使用的地球半径是多少? @jarnbjo:我在所有方面都考虑了单位,但我想我错过了一个,那就是 Solr 网络服务单位! @TreyA 我已经将测试的源代码放在了gist.github.com/1433194,但我使用的半径是:DistanceUtils.EARTH_MEAN_RADIUS_KM * DistanceUtils.KM_TO_MILES = 6371.009 * 0.621371192 exactly
【参考方案1】:
查看更新,错误已解决。感谢@jarnbjo 和@TreyA 提醒我一个愚蠢的问题。在将来调试库代码之前,我应该查看代码中的愚蠢错误。
【讨论】:
以上是关于Solr 3.4 Geodist 功能,不正确/或不需要的结果的主要内容,如果未能解决你的问题,请参考以下文章
SolrNet 空间搜索 - 在 geodist() 上排序
Apache Solr - Lucene - 邮政编码半径搜索