5

正在使用 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 对这些值执行数字范围/比较操作时,我可以在搜索结果中获得正确的最近城市?

谢谢。

4

2 回答 2

6

这是该主题专家 Uwe Schindler关于在 Lucene 中搜索数值域的前沿。您可能需要使用较旧(且速度较慢)的 ConstantScoreRangeQuery,因为 Lucene.net 有点落后于 Lucene,并且链接中描述的类 NumericRangeQuery 尚未在 Java Lucene 中发布。

于 2009-06-28T18:50:50.973 回答
1

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

您不应该按原样索引负数,尤其是在这种情况下,其中一些值为负数,而一些值为正数。

这篇文章似乎对空间搜索进行了很好的讨论。他使用了一些转换来使所有值变为正数,并且他还涉及您可能应该注意的其他主题,例如距离计算。

如果要对值进行编码,要记住的一件事是在索引和构建查询时对它们进行编码。

于 2009-06-29T07:27:54.383 回答