Solr 4空间搜索多边形与带距离参数的多边形搜索

时间:2013-05-13 16:26:53

标签: solr lucene polygon distance spatial

有没有办法在索引多边形的X距离内搜索多边形?

我已经在SOLR 4.2.1索引中使用字段类型索引多边形和多边形

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

我已经可以做简单的交叉查询,比如

fq=geo_location:"Intersects(POLYGON((-0.141964 51.515580, -0.130119 51.516648, -0.129261 51.515900)))"

所以我需要:
在满是POLYGONS的索引中搜索POLYGON +距离 和 在满是POLYGONS

的索引中搜索POINT +距离(圆圈)

1 个答案:

答案 0 :(得分:3)

已支持点+距离(圆圈): http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
例如:geo_location:“相交(圆(4.56,1.23 d = 0.0710))”

多边形+距离按所述距离缓冲多边形,然后进行标准交叉。 JTS有一个很容易使用的Geometry.buffer()操作 - 它只是一个方法调用。我希望有一天能在Spatial4j(今年有可能)中以某种方式揭露它,然后可以访问更高级别的Solr。同时,您可以在客户端代码中使用JTS缓冲多边形,然后将该多边形提交给Solr进行搜索。

请记住,JTS在2D空间中工作;它对测地线一无所知(即它没有考虑到世界是一个球体的事实)。 Spatial4j包装JTS几何以添加日期行包装支持,但就是这样。您想要做的事情是考虑使用地图投影,如果您的所有数据都方便地位于世界的一个地方。这可以大大减少一些偏斜效应。如果不这样做,将会发生偏斜效应的一个例子是,从赤道到极点一半的缓冲多边形实际上将被缓冲到东西向的一半,就像它从南北缓冲一样。即使您没有在某些投影中存储Solr中的点,您的客户端也可以在本地投影查询多边形(在多边形的中心),然后缓冲它,然后将其反投影回lat-lon空间。如果多边形上有很多点,那么这将大大减少偏斜。如果查询多边形没有多个顶点,则可以人为添加它们。我在本段中讨论的所有内容都是我希望在一天内添加的内容,以便它是自动的。