正确索引Lucene中的纬度和经度值

时间:2009-06-28 16:11:06

标签: lucene lucene.net

正在使用Lucene API处理“在给定半径内基于​​美国的最近城市搜索”功能。 我在Lucene索引城市的纬度和长值如下:

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

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

由于Lucene只理解字符串而不是数字,所以填充lat和long值。

例如,如果原始lat和long分别为41.811846和-87.820628,则在填充后,值看起来像:

paddedLatitude - >“0041.811846”和paddedLongitude - >“ - 087.820628”

在构建最近的城市查询时使用相同的填充(使用Lucene的ConstantScoreRangeQuery类)。

鉴于lat和long值可能是十进制/负数,这是正确的索引方法,以便当lucene对这些数据执行数字范围/比较操作时,我会在搜索结果中得到正确的最近城市值?

感谢。

2 个答案:

答案 0 :(得分:6)

这是关于这个问题的专家Uwe Schindler关于Searching Numerical Fields in Lucene的前沿问题。您可能需要使用较旧(和较慢)的ConstantScoreRangeQuery,因为Lucene.net稍微落后于Lucene,并且链接中描述的NumericRangeQuery类尚未在Java Lucene中发布。

答案 1 :(得分:1)

Yuval F回答中的链接文章让我意识到我在earlier answer中错了,你似乎依赖它。

您不应该按原样对负数进行索引,尤其是在这种情况下,其中某些值为负数且某些值为正数。

This article似乎对空间搜索有了很好的讨论。他使用一些变换来使所有值都变为正值,并且他还触及了你可能应该注意的其他主题,比如距离计算。

如果您对值进行编码,则需要记住的一件事是对索引和构建查询进行编码。