2

我的 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 和 long 值在给定范围内。

如您所知,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 个城市:

  • 伊利诺伊州里昂

    伊利诺伊州奥克布鲁克

    加利福尼亚州旧金山

如果我输入“Lyons, IL”,那么这个记录就会出现。但是,如果我将加利福尼亚州旧金山作为输入,那么它不会。

但是,如果我按如下方式存储此文档的城市:

  • 加利福尼亚州旧金山

    伊利诺伊州里昂

    伊利诺伊州奥克布鲁克

    当我将 San Francisco, CA 作为输入时,此记录会显示在搜索结果中。

我在这里想要的是,如果我在输入中输入 3 个城市中的任何一个,我应该在搜索结果中得到这个文档。

请帮助我实现这一目标。

谢谢。

4

3 回答 3

3

按照 skaffman 的建议,您可以使用所有流行的地图应用程序使用的相同图块坐标系。选择适合您需要的任何缩放级别,并且不要忘记用前导零填充。

关于RangeQuery,它比 ConstantScoreRangeQuery 慢并且限制了值的范围。

关于城邦问题,我们只能推测。但首先要检查的是索引词和解析后的查询是否符合您的预期。

于 2009-06-27T21:48:31.130 回答
1

我认为最好的方法是按照上一篇文章中的建议转换/规范化坐标。本文正是这样做的。它实际上是相当不错的面向对象代码。

关于你的第二个问题。我会假设你有某种分析器问题。您是否使用相同的分析器进行索引和查询?您使用哪些标记器?

我建议使用Luke来检查您生成的索引,以查看哪些标记实际上是可搜索的。

——哈代

于 2009-07-01T10:45:15.057 回答
0

这里的一种选择是将坐标转换为没有负数的系统。例如,我在英国的 google maps webapp 遇到了类似的问题,我在 Lucene 中存储了 UK Easting/Northings(范围从 0 到 7 位)字段以及 lat/long 值。通过用左填充零格式化这些东/北,我可以进行 lucene 范围查询。

美国有类似的坐标系吗?

于 2009-06-27T19:53:35.230 回答