基于Lucene的位置搜索空间查询

基于Lucene的位置搜索空间查询,lucene,lucene.net,Lucene,Lucene.net,我的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值在给定

我的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个城市:

  • 伊利诺伊州里昂

    伊利诺伊州橡树溪

    加利福尼亚州旧金山

如果我输入“伊利诺伊州里昂”,那么这个记录就会出现。 但是如果我把旧金山、CA作为输入,那么它就不会。 但是,如果我将此文档的城市存储为:

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));
  • 加利福尼亚州旧金山

    伊利诺伊州里昂

    伊利诺伊州橡树溪

    当我把旧金山、CA作为输入,那么这个记录显示在搜索结果中。

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

请帮我做到这一点


谢谢。

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


美国有类似的坐标系吗?

根据斯卡夫曼的建议,你可以使用所有流行地图应用程序使用的相同坐标系。选择适合您需要的足够精细的缩放级别,别忘了用前导零填充

关于,它比ConstantCorerangeQuery慢,并且限制了值的范围


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

我认为最好的方法是按照前一篇文章中的建议转换/规范化坐标。就是这样。这实际上是非常好的面向对象的代码

关于你的第二个问题。我想你可能有什么分析仪问题。您是否使用相同的分析器进行索引和查询?您使用哪些标记器

我建议使用来检查生成的索引,以查看哪些令牌实际上是可搜索的


--哈代

谢谢..我将探讨这个选项..你能回答我关于多个城市的问题的第二部分吗?这实际上是三个独立的问题。你为什么不把它分开呢?在这里。我为你迈出了第一步: