2009-06-27 25 views
2

基於位置的搜索我的Lucene索引得到了索引的緯度和經度字段如下:空間查詢使用Lucene的

doc.Add(new Field("latitude", latitude.ToString() , Field.Store.YES, Field.Index.UN_TOKENIZED)); 

doc.Add(new Field("longitude", longitude.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED)); 

我想從這個指標,其lat和長值是在給定的檢索文檔集範圍。如你所知,Lat和long可能是負值。我如何正確地在Lucene中存儲帶符號的十進制數字? 下面提到的方法會給出正確的結果還是有任何其他方式來做到這一點?

Term lowerLatitude = new Term("latitude", bounds.South.ToString()); 
       Term upperLatitude = new Term("latitude", bounds.North.ToString()); 
       RangeQuery latitudeRangeQuery = new RangeQuery(lowerLatitude, upperLatitude, true); 
       findLocationQuery.Add(latitudeRangeQuery, BooleanClause.Occur.SHOULD); 



       Term lowerLongitude = new Term("longitude", bounds.West.ToString()); 
       Term upperLongitude = new Term("longitude", bounds.East.ToString()); 
       RangeQuery longitudeRangeQuery = new RangeQuery(lowerLongitude, upperLongitude, true); 
       findLocationQuery.Add(longitudeRangeQuery, BooleanClause.Occur.SHOULD); 

此外,我想知道Lucene的ConstantScoreRangeQuery如何比RangeQuery類更好。

現在面臨這方面的另一個問題: 我在用下面的3個城市索引的文件之一:

  • 里昂,IL

    奧克布魯克,IL

    舊金山,加利福尼亞州

如果我給「Lyons,IL」然後這個記錄出現。 但是,如果我給舊金山,CA作爲輸入,那麼它不會。

但是,如果我保存城市的這些文獻資料如下:

  • 舊金山,CA

    里昂,IL

    奧克布魯克,IL

    當我以CA的舊金山作爲輸入,然後將此記錄顯示在搜索結果中。

什麼,我想在這裏的是,如果我輸入任何輸入的3個城市,我應該在搜索結果中得到這個文件。

請幫我實現這一點。

謝謝。

+0

這真是3個不同的問題。你爲什麼不分割它? – itsadok 2009-06-28 07:01:20

+0

這裏。我爲你做了第一步:http://stackoverflow.com/questions/1054719 – itsadok 2009-06-28 11:01:19

回答

3

跟隨skaffman的建議,你可以使用所有流行的地圖應用程序使用的相同tile coordinate system。選擇適合您需求的任何縮放級別,並且不要忘記填充前導零。

關於RangeQuery,它比ConstantScoreRangeQuery慢,並且限制了值的範圍。

關於城邦問題,我們只能推測。但首先要檢查的是索引條款和解析後的查詢是你期望的。

0

此處的一個選項是將座標轉換爲不具有負數的系統。例如,我在英國的谷歌地圖網絡應用程序中遇到了類似的問題,並且我在Lucene中存儲了UK/Eastings/Northings(範圍從0到7位)字段以及緯度/經度值。通過用左填充的零格式化這些東/北,我可以執行lucene範圍查詢。

美國有沒有類似的座標系?

1

我認爲最好的方法是按照上一篇文章中的建議轉換/標準化座標。這article正是這樣做。這實際上是非常好的面向對象的代碼。

關於你的第二個問題。我會假設你有某種分析儀問題。您是否使用相同的分析器進行索引和查詢?你使用了哪些分詞器?

我建議使用Luke檢查您生成的索引,以查看實際可搜索的令牌。

- 哈迪