Solr 4 Spatial Query Filter по-прежнему возвращает документы вне допустимого диапазона

Цель состоит в том, чтобы выполнить мультисортировку по счету, а затем по расстоянию, а для ограничения радиуса 0,14 градуса я выполняю следующий запрос:

localhost:8983/solr/coll1/select?sortsq={! score=distance}locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))"&fl=score,distdeg:query($sortsq),*&facet=true&sort=score desc,query($sortsq) asc&indent=on&wt=xml&version=2.2&rows=10&start=0&q=text:*&facet.field=xxxxx&fq=fieldname:"filterValue"

Возвращаются все документы, соответствующие запросу, независимо от того, находятся ли они в пределах круга или нет, но те, которые находятся в пределах 0,14 градуса, возвращают расстояние (distdeg), а другие не возвращают это поле.

Как я могу опустить непересекающиеся документы?

объявление поля местоположения:

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

Обновление: рабочая версия запроса

http://localhost:8983/solr/coll1/select?getDist={! score=distance}locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))"&fl=score,distdeg:query($getDist),*&facet=true&sort=score desc&indent=on&wt=xml&version=2.2&rows=10&start=0&q=*:*&boost=query({! score=distdeg filter=false v=$getDist)&fq=locations:"Intersects(Circle(34.0031792,-118.3082034 d=0.14))",states:"CA"

person Omar S.    schedule 21.01.2013    source источник


Ответы (1)


На самом деле вы вообще не осуществляете пространственную фильтрацию. Поиск solr сопоставляет документы на основе «q» (строка запроса от пользователя; он оценивается) и «fq» (запросы фильтра, которые не оцениваются), ничего больше. Ни ваш «q», ни ваш «fq» не относятся к пространственному фильтру, который вы поместили в параметр sortsq. См. документы: http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4#Search

Ваш q=text:* странный; что ты собираешься делать? Все документы? Может показаться, что этот запрос работает, но не делайте этого, так как он не делает того, что вы думаете; он находит все документы, которые имеют какое-либо значение в этом поле (не быстро для вычисления), что не обязательно для всех документов. Лучшей практикой является defType=edismax и q.alt=*:* и qf=text (при условии, что это ваше поле текстового поиска), которые будут соответствовать всем документам, если у вас нет строки запроса для предоставления.

Кстати, нет никакого смысла следовать за сортировкой очков с чем-либо еще. Существует огромное разнообразие значений с плавающей запятой, и, следовательно, расстояние редко будет учитываться. Вместо этого вы, вероятно, захотите повысить баллы по расстоянию. Вот пример этого: &boost=query({! score=recipDistance filter=false v=$spatialfilter}) (замените имя вашего параметра, который имеет пространственный поиск, на пространственный фильтр).

person David Smiley    schedule 21.01.2013
comment
Большое спасибо за ваш ответ, имеет смысл увеличить расстояние, но я действительно хочу понять этот синтаксис, есть ли какая-либо документация для синтаксиса повышения и функции, вычисляющей расстояние. Я обновил вопрос с рабочим синтаксисом запроса, но пока без dismax. Если есть какие-либо улучшения, которые я могу сделать, пожалуйста, сообщите мне, большое спасибо за ваше время и усилия. - person Omar S.; 22.01.2013
comment
В вашем обновленном запросе параметр boost используется правильно, но вы не указали defType=edismax (edismax ищет параметр boost, ничего больше). И я заметил, что в конце вашего «fq» написано «CA», что неверно, так как запятой не должно быть, может быть, вы имеете в виду «ИЛИ»? Я разместил ссылку на пространственную страницу Solr 4 в вики Solr. Я должен добавить пример, изображающий бустинг. Возможно, вы захотите прочитать мою книгу или посмотреть другую информацию (например, вики) на dismax/edismax. - person David Smiley; 23.01.2013
comment
Вы правы, я опустил , заменил на AND и включил анализатор запросов dismax, но здесь возникает путаница, в документах написано, что параметр qf определяет определенные возвращаемые поля, которые аналогичны параметру fl, но с возможность увеличить время запроса, я пытался использовать параметр qf, но он не работает с degdist:query($getDist). Я не уверен, что использовать fl или qf, или оба fl для полей и qf для повышения некоторых полей? также есть параметр повышения, который вы указали. Может ли он обрабатывать несколько повышений? Должен ли я использовать его или использовать qf для повышения полей? - person Omar S.; 25.01.2013
comment
Только 'fl' (список полей) содержит список полей, возвращаемых в результатах поиска. «qf» (поля запроса) указывает, к каким полям будет применяться запрос «q» (поиск по ключевому слову, а не пространственный), а также позволяет указать, какие из этих полей более релевантны. «Повышение» предназначено для функционального запроса, результат которого будет умножен на оценку документа (более или менее), чтобы повысить некоторые документы больше, чем другие. При желании его можно повторить. Я предлагаю начать с основных параметров и убедиться, что они ведут себя так, как вы понимаете, а затем постепенно добавлять новые. - person David Smiley; 26.01.2013
comment
В этом есть смысл. Большое спасибо, вы спасли меня от многих часов разочарования. Я обязательно куплю книгу. - person Omar S.; 07.02.2013