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 - 邮政编码半径搜索

在 solr 3.4 中放置突出显示片段配置的位置

`@geodist` 如何在 Sphinx 中实现排序/搜索?

SOLR 索引尺寸减小

solr全文检索,建立的文件索引,检索不出正确结果