【问题标题】:Filter query on a Solr spatial field is returning all documents with a non-null valueSolr 空间字段上的过滤器查询返回所有具有非空值的文档
【发布时间】:2019-05-13 00:07:18
【问题描述】:

使用 Solr 7.7,我正在索引简单的矩形多边形,并尝试通过任意边界框过滤它们,因此我使用了 Solr 网站上记录的“范围查询语法”技巧。

这是字段的定义:

<fieldType name="my_geom"
   class="solr.SpatialRecursivePrefixTreeFieldType"
   spatialContextFactory="Geo3D"
   planetModel="WGS84"
   distanceUnits="kilometers"
   format="WKT"
   geo="true"
/>
<field name="*_geom" type="my_geom" indexed="true" stored="true" />

这里是查询:

/select?fq=spatial_geom:[55.0260828,-115.5085624 TO 55.02646,-115.507337]&q=*:*

我希望只获得落在定义的边界框内的结果,但我实际上获得了在“spatial_geom”字段中具有非空值的所有文档。这是我不希望(但我)得到的文档示例:

{
    "spatial_geom":"POLYGON((-118.080201721669 54.5864541583249,-118.080201721669 54.5865258517606,-118.080078279314 54.5865258517606,-118.080078279314 54.5864541583249,-118.080201721669 54.5864541583249))",
    ...[other fields redacted]
}

编辑 1: 升级到 Solr 8.0.0 仍然遇到同样的问题。鉴于我正在获取 所有 个文档(具有非空值),我怀疑我在做一些根本错误的事情,我只是看不到它。

编辑 2: 为了使用更简单的数字来仔细检查数据是否不错,我使用以下 WKT POLYGON((10 10,10 20,20 20,20 10,10 10)) 加载了所有带有假多边形的文档,然后使用查询?fq=spatial_geom:[30,30 TO 40,40] 它仍然返回所有文件!

【问题讨论】:

    标签: solr


    【解决方案1】:

    Geo3D 要求多边形遵守“右手定则”,因此外环必须按逆时针顺序排列,孔必须按顺时针方向排列。如果你犯了这个错误,那么形状的含义就会被颠倒,因此加拿大艾伯塔省的那个小矩形代表那个地方的倒置。因此,大多数形状将覆盖几乎整个地球! Solr 中肯定需要一个文档问题来达到这个效果。直到我今天调试这个我才知道!一些 GIS 行业似乎也在迁移到这条规则:http://mapster.me/right-hand-rule-geojson-fixer/

    另外:我很想知道 Geo3D 与 JTS 相比在您开始工作后有何不同。此外,您可能应该使用 solr.RptWithGeometrySpatialField 而不是 solr.SpatialRecursivePrefixTreeFieldType 来获得矢量几何的完整精度,而不是停留在形状的网格表示上,否则您的查询可能会因为接近索引形状而得到误报.另一件要尝试的事情是使用 prefixTree="s2",它是一个尚未记录的 prefixTree,据说对于 Geo3D 来说更有效。

    【讨论】:

      【解决方案2】:

      我使用 JTS 让它工作,虽然我不确定为什么这是必要的,并且它显着减慢了数据导入时间。

      这是新的字段类型定义:

      <fieldType name="my_geom"
        class="solr.SpatialRecursivePrefixTreeFieldType"
        spatialContextFactory="JTS"
        autoIndex="true"
        distanceUnits="kilometers"
        format="WKT"
        geo="true"                                                                              
        />
      

      我还根据 Solr 的文档下载了 JTS jar。

      但是我仍然无法解释为什么使用 JTS 是必要的,因为 Solr 文档让我相信我应该能够使用 Geo3D 索引多边形:

      Geo3D 是 Lucene 空间 3d 模块的俗称,包含在 Solr 中。它是一个计算几何库,在球体或 WGS84 椭圆体上实现了各种形状(包括多边形)。

      使用 Geo3D 在导入或查询期间没有给我任何错误,只是没有给我预期的结果。奇怪...

      【讨论】:

        【解决方案3】:

        我还可以使用 Solr 的 BBoxField 类型(和 JTS)。见字段类型定义:

        <fieldType name="my_bbox"
          class="solr.BBoxField"
          spatialContextFactory="JTS"
          format="WKT"                                                                      
          geo="true"
          distanceUnits="kilometers"
          numberType="pdouble"
          />
        

        我仍然不清楚为什么使用 SpatialRecursivePrefixTreeFieldTypeGeo3D 不能提供正确的结果。

        数据导入速度明显快于SpatialRecursivePrefixTreeFieldTypeJTS

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多