Solr4空间故障排除多边形

时间:2012-11-14 08:22:29

标签: solr

我正在尝试解决Solr4及其空间功能。 我有一个用“geo”字段索引的文档。

其中我有以下

纬度-34.7413

经度149.7102

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

我也尝试将同一文档编入索引

<geo> 149.710238 -34.741328 
如果你不是逗号分隔值,则建议使用

(反转lat / long顺序并在值之间加一个空格)。

文档索引就好了。

我正在尝试向其发送多边形搜索。多边形是三角形,如果可以想象三角形的下面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 无法阅读:POLYGON(-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配置问题,某种方式没有正确安装,我发送坐标和形状的方式,或者我缺少的其他东西。

2 个答案:

答案 0 :(得分:3)

好的,所以我想在经过几天的努力之后,我在David Smiley的帮助下解决了这个问题,David Smiley在互联网上出现帮助我自己和其他人解决他们的Solr Spatial问题 - 如果我们见过面,我会向你倒入许多啤酒- 谢谢你的帮助。

你必须反转每个co-ord的长度/长度(长/纬度)并且它有效。马上。 So.Simple。

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 - 这就是money文件。 3.将其上传到您的solrinstall / solr.war / WEB-INF / lib / location - 当您在那里看到许多其他.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 记住Lat =水平,Long =垂直线。 6.使用Lucene搜索方法测试您的搜索。你可以做一个非常简单的矩形搜索。找到您的目标文件GEO点,然后在左下角找到一个坐标,并在右上角找到一个坐标。矩形所需的只有2个点,您只需进行范围搜索即可。对我来说,它看起来像这样。

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

如果可行的话,你可以进行基本的GEO搜索工作。

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

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

  2. 如您所见,lat / long为long / lat,每个long / lat由空格分隔,每个co-ord对用逗号“,”分隔。

    希望这个帖子可以帮助别人。

答案 1 :(得分:2)

  

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

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

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

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