2011-12-05 72 views
0

我遇到了Solr 3.4的問題,我正在使用它的空間搜索功能,如 Geodist和Geofilt。 一切看起來都很好,結果是按照給定中心點的距離來回歸。Solr 3.4 Geodist功能,不正確或不需要的結果

但是由於Solr 3.4缺乏返回數據中函數結果的能力,我不得不手動計算它(在這種情況下是由PHP計算)。

我讀了文檔,geodist應該是一個函數,它實現了2 lat/lng點之間的地理距離的haversine函數。我將函數移植到PHP(easy!),並確保它給出正確的結果。

問題是:Solr計算我找不到的公式中的距離。所以當我用PHP重新計算距離時,它會導致數據距離不一致(例如132Mile而不是83Mile),這並不是我能容忍的差異。

我的解決方案:我說好了它的方便,以創建一個功能比較,看看我在港的數據搞錯了,我挖成Solr codeorg.apache.solr.search.function.distance.HaversineConstFunction提取字面實施havesine的,結果幾乎完全相同。並做了這個testing script (full source code and data)

我的結論是,Solr(或Lucene)沒有使用haversine作爲geodist實現。但我不知道哪個方程。

UPDATE該錯誤已得到解決。我想我的測試結果太過分了。 錯誤的結果是由於錯誤的參數命名而發生的,我使用order(來自SQL的一個)而不是sort(Solr約定)來更改Solr Web服務結果的順序。

+0

你確定你不是簡單地得到正確的數字和使用錯誤的單位嗎? 83英里至少大約132公里。 – jarnbjo

+0

爲了繼續jarnbjo,我在Haversine中看到的最常見的錯誤是1)忘記將緯度/經度從度數轉換爲弧度,2)沒有意識到地球半徑的單位將是輸出距離單位。你在Haversine公式中使用了什麼半徑的地球? – TreyA

+0

@jarnbjo:我在所有的點上都考慮過單位,但我猜想有一個我錯過了的,就是Solr的webservice單元! –

回答

1

查看更新,錯誤已得到解決。感謝@jarnbjo和@TreyA提醒我一個愚蠢的問題。在將來調試庫代碼之前,我應該查看代碼中的愚蠢錯誤。