我的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类。
在这种情况下,我还面临着另一个问题:我在索引中有以下三个城市的文档之一:
如果我输入的是“莱昂斯,IL”,那么这个记录就出现了。但是如果我给旧金山CA作为输入,它就不会。
但是,如果我将本文档的城市存储如下:
我想要的是,如果我输入三个城市中的任何一个,我应该在搜索结果中得到这个文档。
请帮我实现这一目标。
谢谢。
发布于 2009-06-27 21:48:31
按照skaffman的建议,您可以使用所有流行的地图应用程序使用的相同的瓷砖坐标系。选择适合你需要的缩放级别,别忘了用前导零来填充。
对于RangeQuery,它比ConstantScoreRangeQuery慢,并且限制了值的范围。
关于城邦问题,我们只能猜测。但是首先要检查的是索引项和解析的查询是您期望的结果。
发布于 2009-07-01 10:45:15
我认为最好的方法是像上一篇文章所建议的那样转换/正常化坐标。这个文章就是这样做的。它实际上是相当不错的面向对象的代码。
关于你的第二个问题我假设你有某种分析器问题。您是否使用相同的分析器进行索引和查询?您使用哪些令牌?
我建议使用卢克来检查生成的索引,看看哪些标记实际上是可搜索的。
-哈迪
发布于 2009-06-27 19:53:35
这里的一个选择是将坐标转换成没有负数的系统。例如,对于英国的google地图lat应用程序,我遇到了类似的问题,我在Lucene的lat/long值旁边存储了UK maps /Northing(从0到7位数)字段。通过用左填充的零格式化这些东西,我可以进行lucene范围查询。
美国有类似的坐标系吗?
https://stackoverflow.com/questions/1052086
复制相似问题