Solr空间字段上的筛选器查询正在返回具有非空值的所有文档

Solr空间字段上的筛选器查询正在返回具有非空值的所有文档,solr,Solr,使用Solr 7.7,我为简单的矩形多边形编制索引,并尝试通过任意边界框对它们进行过滤,因此我使用Solr网站上记录的“范围查询语法”技巧 以下是该字段的定义: <fieldType name="my_geom" class="solr.SpatialRecursivePrefixTreeFieldType" spatialContextFactory="Geo3D" planetModel="WGS84" distanceUnits="kilometers"

使用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" />
我希望只得到定义的边界框内的结果,但实际上我得到的所有文档在“spatial_geom”字段中都有非空值。下面是一个我不希望(但我希望)得到的文档示例:

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


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

我使用JTS实现了它,尽管我不确定为什么这是必要的,而且它显著地降低了数据导入时间

以下是新的字段类型定义:

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

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

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

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


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

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

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

我仍然不清楚为什么将
SpatialRecursivePrefixTreeFieldType
Geo3D
一起使用不能提供正确的结果


数据导入速度明显快于将
SpatialRecursivePrefixTreeFieldType
JTS

Geo3D要求多边形遵守“右手法则”,因此外环必须按逆时针顺序排列,孔必须按顺时针方向排列。如果你犯了这个错误,那么这个形状的意义是颠倒的,因此加拿大阿尔伯塔省的那个小矩形代表了这个地方的倒数。因此,大多数形状将覆盖几乎整个地球!在Solr中肯定需要一个文档问题来实现这一点。直到今天我调试了这个,我才知道!一些GIS行业似乎也在向这一规则迁移:

另外:我很想看看Geo3D和JTS在工作后的对比情况。此外,您可能应该使用solr.RptWithGeometrySpatialField而不是solr.SpatialRecursivePrefixTreeFieldType来获得向量几何体的全部精度,而不是停留在形状的网格表示上,否则您的查询可能会因为接近索引形状而得到误报。另一个尝试是使用prefixTree=“s2”,这是一个尚未记录的prefixTree,据说它对于Geo3D来说更为有效