Запрос фильтра по пространственному полю Solr возвращает все документы с ненулевым значением - PullRequest
0 голосов
/ 18 марта 2019

Используя 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=*:*

Я ожидаю получить только результаты, попадающие в областьопределил ограничивающий прямоугольник, но на самом деле я получаю ВСЕ документы, которые имеют ненулевое значение в поле «atial_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], и он все еще вернулсяВСЕ документы!

Ответы [ 3 ]

1 голос
/ 12 мая 2019

Geo3D требует, чтобы полигоны придерживались «правила правой руки», и поэтому внешнее кольцо должно быть в порядке против часовой стрелки, а отверстия - по часовой стрелке. Если вы совершите эту ошибку, то значение формы будет инвертировано, и, таким образом, этот маленький прямоугольник в провинции Альберта, Канада, представляет собой инверсию этого места. Следовательно, большинство фигур покроет почти весь земной шар! С этой целью в Solr, безусловно, существует проблема с документацией. Даже я не знал, пока не отладил это сегодня! Похоже, что некоторые из ГИС-индустрии тоже переходят на это правило: http://mapster.me/right-hand-rule-geojson-fixer/

Отдельно: мне было бы очень любопытно посмотреть, как Geo3D сравнивается с JTS после того, как вы его заработаете. Кроме того, вам, вероятно, следует использовать solr.RptWithGeometrySpatialField вместо solr.SpatialRecursivePrefixTreeFieldType, чтобы получить полную точность векторной геометрии, вместо того, чтобы рассчитывать на представлении формы в виде сетки, в противном случае ваши запросы могут получить ложные срабатывания только за то, что они находятся близко к индексированной форме. , Еще одна вещь, которую стоит попробовать, - это использовать prefixTree = "s2", который еще не документирован как prefixTree, который, предположительно, гораздо более эффективен для Geo3D.

0 голосов
/ 18 марта 2019

Я также получил его работать с типом Solr BBoxField (и JTS).См. Определение типа поля:

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

Мне все еще неясно, почему использование SpatialRecursivePrefixTreeFieldType с Geo3D не дает правильных результатов.

Скорость импорта данных значительно выше, чем при использованииSpatialRecursivePrefixTreeFieldType с JTS.

0 голосов
/ 18 марта 2019

Я работал с использованием JTS, хотя я не уверен, почему это было необходимо, и это значительно замедлило время импорта данных.

Вот новое определение типа поля:

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

Я также скачал JTS jar, согласно документации Solr.

Однако я все еще не могу объяснить , почему использование JTS необходимо, учитывая, что документация Solr заставила меня поверить, что я долженспособен индексировать полигоны с помощью Geo3D:

Geo3D - разговорное название пространственного 3d-модуля Lucene, включенного в Solr.Это библиотека вычислительной геометрии, реализующая различные формы (включая многоугольники) на сфере или эллипсоиде WGS84.

Использование Geo3D не дало мне ошибок при импорте или запросе, просто не дало ожидаемых результатов.Weird ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...