используя OR и NOT в запросе solr - PullRequest
81 голосов
/ 11 марта 2009

Я работаю над запросом solr, похожим на следующее:

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)

При выполнении этого результаты не возвращаются. Использование критериев по обе стороны от ИЛИ-НЕ возвращает ожидаемые результаты - они просто не работают хорошо вместе. В случае, если myField соответствует superneat , я также хочу убедиться, что для myOtherField установлено значение somethingElse , но если myField не является супернеатом , включите его в результаты.

Может кто-нибудь объяснить, почему solr не возвращает результаты для этого вида запроса? Следует ли каким-либо образом реструктурировать запрос - или есть другой способ использования solr для достижения желаемого результата?

Ответы [ 6 ]

82 голосов
/ 11 марта 2009

Я не знаю, почему это не работает, но этот логически эквивалентен, и он работает :

-(myField:superneat AND -myOtherField:somethingElse)

Может быть, это связано с определением одного и того же поля в запросе дважды ...

Попробуйте задать вопрос в solr-user group , а затем опубликуйте здесь окончательный ответ!

39 голосов
/ 22 августа 2009
Instead of "NOT [condition]" use "(*:* NOT [condition])"
32 голосов
/ 28 января 2014

Solr в настоящее время проверяет «чисто отрицательный» запрос и вставляет *:* (который соответствует всем документам), чтобы он работал правильно.

-foo преобразовывается с помощью solr в (*:* -foo)

Большое предостережение в том, что Solr проверяет только, является ли запрос верхнего уровня чисто отрицательным запросом! Таким образом, это означает, что запрос типа bar OR (-foo) не изменяется, поскольку чисто отрицательный запрос находится в подпункте запроса верхнего уровня. Вам нужно самостоятельно преобразовать этот запрос в bar OR (*:* -foo)

Вы можете проверить объяснение запроса solr, чтобы проверить преобразование запроса:

?q=-title:foo&debug=query

преобразуется в

(+(-title:foo +MatchAllDocsQuery(*:*))
23 голосов
/ 24 марта 2014

Собрав воедино комментарии из нескольких разных ответов здесь, в документации Solr и на другом вопросе SO, я обнаружил, что следующий синтаксис дает правильный результат для моего варианта использования

(my_field = my_value или my_field равно нулю):

(my_field:"my_value" OR (*:* NOT my_field:*))

Это работает для Solr 4.1.0. Это немного отличается от варианта использования в OP; но я думал, что другие найдут это полезным.

8 голосов
/ 13 марта 2009

Последующие действия в группе solr-user можно найти в: списке рассылки solr user

Преобладает мысль, что оператор NOT можно использовать только для удаления результатов из запроса, а не только для исключения элементов из всего набора данных. Мне нравится синтаксис, который вы предложили mausch - спасибо!

3 голосов
/ 17 октября 2018

Просто, чтобы добавить еще один неожиданный случай, вот запрос, который не дал ожидаемых результатов:

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_b в моем случае - это то, над чем я выполняю огранку, и мне нужно было настроить таргетинг на термин запроса "foo" только для этого типа (бар)

Мне пришлось вставить еще один *:* после условия или, чтобы заставить это работать, например так:

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

edit: это в solr 6.6.3

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