首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Lucene实现基于位置的SpatialQuery搜索

使用Lucene实现基于位置的SpatialQuery搜索
EN

Stack Overflow用户
提问于 2009-06-27 03:56:58
回答 3查看 1.7K关注 0票数 2

我的lucene索引的纬度和经度字段被索引如下:

代码语言:javascript
复制
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中?下面提到的方法会给出正确的结果吗?还是有其他方法来做到这一点?

代码语言:javascript
复制
 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作为输入,它就不会。

但是,如果我将本文档的城市存储如下:

  • 加利福尼亚州旧金山 里昂湖 橡树溪 当我给旧金山,CA作为输入时,这个记录会显示在搜索结果中。

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

请帮我实现这一目标。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-27 21:48:31

按照skaffman的建议,您可以使用所有流行的地图应用程序使用的相同的瓷砖坐标系。选择适合你需要的缩放级别,别忘了用前导零来填充。

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

关于城邦问题,我们只能猜测。但是首先要检查的是索引项和解析的查询是您期望的结果。

票数 3
EN

Stack Overflow用户

发布于 2009-07-01 10:45:15

我认为最好的方法是像上一篇文章所建议的那样转换/正常化坐标。这个文章就是这样做的。它实际上是相当不错的面向对象的代码。

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

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

-哈迪

票数 1
EN

Stack Overflow用户

发布于 2009-06-27 19:53:35

这里的一个选择是将坐标转换成没有负数的系统。例如,对于英国的google地图lat应用程序,我遇到了类似的问题,我在Lucene的lat/long值旁边存储了UK maps /Northing(从0到7位数)字段。通过用左填充的零格式化这些东西,我可以进行lucene范围查询。

美国有类似的坐标系吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1052086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档