【问题标题】:SpatialQuery for location based search using Lucene使用 Lucene 进行基于位置的搜索的 SpatialQuery
【发布时间】:2009-06-27 03:56:58
【问题描述】:

我的 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 作为输入,那么它不会。

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

  • 加利福尼亚州旧金山

    伊利诺伊州里昂

    伊利诺伊州奥克布鲁克

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

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

请帮助我实现这一目标。

谢谢。

【问题讨论】:

标签: lucene lucene.net


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    --哈迪

    【讨论】:

      【解决方案3】:

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

      美国有类似的坐标系吗?

      【讨论】:

      • 谢谢..我将探讨该选项...您能否回答我关于多个城市的问题的第二部分?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多