正在使用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对这些数据执行数字范围/比较操作时,我会在搜索结果中得到正确的最近城市值?
感谢。
答案 0 :(得分:6)
这是关于这个问题的专家Uwe Schindler关于Searching Numerical Fields in Lucene的前沿问题。您可能需要使用较旧(和较慢)的ConstantScoreRangeQuery,因为Lucene.net稍微落后于Lucene,并且链接中描述的NumericRangeQuery类尚未在Java Lucene中发布。
答案 1 :(得分:1)
Yuval F回答中的链接文章让我意识到我在earlier answer中错了,你似乎依赖它。
您不应该按原样对负数进行索引,尤其是在这种情况下,其中某些值为负数且某些值为正数。
This article似乎对空间搜索有了很好的讨论。他使用一些变换来使所有值都变为正值,并且他还触及了你可能应该注意的其他主题,比如距离计算。
如果您对值进行编码,则需要记住的一件事是对索引和构建查询进行编码。