3

我正在尝试对 Solr4 及其空间功能进行故障排除。我有一个用“geo”字段索引的文档。

在里面我有以下

纬度 -34.7413

经度 149.7102

Stored as <geo>-34.741328,149.710238</>

我也尝试过索引相同的文档

<geo> 149.710238 -34.741328 

如果您不是用逗号分隔值,则建议这样做(颠倒纬度/经度顺序并在值之间放置一个空格)。

文档索引就好了。

我正在尝试向它发送多边形搜索。多边形是三角形,如果您可以想象三角形的以下 3 个点按顺时针顺序排列。这是一个非常大的三角形,目标坐标在中间某处。我选择了一个三角形以希望进行简单的调试,我打算为这些搜索绘制更复杂的形状

(-34.580136904223494, 149.6165823974609)

(-34.84203933395146, 150.0175833740234)

(-34.84654761634415, 149.4627738037109)

我已向 Solr 发送以下查询并收到错误。

fq=geo:"Intersects(POLYGON(-34.5801 149.6165, -34.8420 150.0175, -34.8465 149.4627))" 

我对三角形的尝试。

fq=geo:"Intersects(POLYGON(-34.5801 149.6165, -34.8420 150.0175, -34.8465 149.4627, -34.5801 149.6165))"

我尝试在三角形上再次添加最后一个坐标以“关闭”多边形。上述 2 个查询仅返回以下错误,不返回任何结果。

错误 500 无法读取:多边形(-34.5801 149.6165,-34.8420 150.0175,-34.8465 149.4627,-34.5801 149.6165)

我想我的问题是首先看哪里?我安装了 JTS 库。Solr Log 记录了这一点。

19:11:50

SEVERE

SolrDispatchFilternull:com.spatial4j.core.exception.InvalidShapeException: Unable to read: POLYGON((-34.5801 149.6165, -34.8420 150.0175, -34.8465 149.4627))

感谢任何人都可以提供的任何指示。我认为问题要么是 solr 配置问题,要么是某些东西没有正确安装,要么是我发送坐标和形状的方式,要么是我缺少的其他东西。

4

2 回答 2

3

好的,所以我想在这几天之后,我在 David Smiley 的帮助下修复了它,他在互联网上出现,帮助我自己和其他人解决 Solr 空间问题 - 如果我们见面,我会给你倒很多啤酒 - 谢谢你的帮助。

您必须颠倒每个坐标的纬度/经度(而不是经度/纬度)并且它起作用了。马上。很简单。

fq=geo:"Intersects(POLYGON((149.4023 -34.6072, 149.4023 -34.8690, 149.9022 -34.8690, 149.9022 -34.6072, 149.4023 -34.6072)))" 

而不是这个

fq=geo:"Intersects(POLYGON((-34.6072 149.4023, -34.8690 149.4023, -34.8690 149.9022, -34.6072 149.9022, -34.6072 149.4023)))" 

希望这个线程可以帮助其他人。

当有疑问时,我尝试调试如下。1.解压solr.war文件,将其保存为文件夹而不是文件。有很多方法可以做到这一点,具体取决于您的服务器。对于像我这样的业余爱好者,configserver explorer,一个 whm 插件,是你的朋友 :)。2. 下载 jts 插件,解压,在 /lib/ 文件夹中有一个文件 jts-1.12.jar - 这是钱文件。3. 将此上传到您的 solrinstall/solr.war/WEB-INF/lib/ 位置 - 当您在其中看到许多其他 .jar 文件时,您知道您在正确的位置 4. 如果您愿意,可以重新打包 war 文件,或者它应该像这样解压。5. 确保您的架构与此处的 solr wiki 中所说的完全一致。默认情况下它不存在。检查并再次检查。添加这个

<fieldType name="location_rpt"   class="solr.SpatialRecursivePrefixTreeFieldType"
           spatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory"
           distErrPct="0.025"
           maxDistErr="0.000009"
           units="degrees"
        />

并以下列方式添加您的字段“geo”。

<field name="geo"  type="location_rpt"  indexed="true" stored="true"  multiValued="true" />

索引您的数据。我的数据按纬度/经度排列,看起来像这样。地理:-34.741328,149.710238 记住纬度=水平,长=垂直线。6. 使用 Lucene 搜索方法测试您的搜索。您可以进行非常简单的矩形搜索。找到您的目标文档 GEO 点,然后在左下角和右上角找到坐标。一个矩形只需要 2 个点,您只需进行范围搜索。对我来说,它看起来像这样。

fq=geo:[-34.8690,149.4023 TO -34.6072,149.9022]

如果那行得通,那么您就可以进行基本的 GEO 搜索了。

  1. 现在让我们用这些坐标制作一个多边形。要制作一个多边形(在这种情况下为矩形),我们需要 5 个坐标,矩形的起始点,3 个其他点,然后再次开始坐标以闭合形状(多边形)。无论出于何种原因,多边形搜索使用不同的纬度/经度布局。你必须扭转这一点。你把经度放在第一位。您还必须以逆时针格式构造此形状。因此,使用由上述坐标构成的点的多边形搜索看起来像这样。

    fq=geo:“相交(多边形((149.4023 -34.6072、149.4023 -34.8690、149.9022 -34.8690、149.9022 -34.6072、149.4023 -34.6072)))”

如您所见,lat/long 是 long/lat,每个 long/lat 用空格分隔,每个坐标对用逗号“,”分隔。

希望这个线程可以帮助其他人。

于 2012-11-16T07:09:19.077 回答
2

fq=geo:“相交(多边形(-34.5801 149.6165,-34.8420 150.0175,-34.8465 149.4627,-34.5801 149.6165))”

你几乎是对的。是的,你需要关闭多边形,你在这里做了。但是您在坐标列表周围缺少一对额外的括号:

fq=geo:“相交(多边形((-34.5801 149.6165,-34.8420 150.0175,-34.8465 149.4627,-34.5801 149.6165)))”

额外的括号是因为可能有多个坐标列表。第一个列表是外环,随后的列表是内环,AKA 孔。这是标准的 WKT。

于 2012-11-14T16:07:55.303 回答