Использование OR и NOT в запросе solr

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

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

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

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

Ответ 1

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

-(myField:superneat AND -myOtherField:somethingElse)

Возможно, он имеет какое-то отношение к определению того же поля дважды в запросе...

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

Ответ 2

Instead of "NOT [condition]" use "(*:* NOT [condition])"

Ответ 3

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

-foo преобразуется как solr в (*:* -foo)

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

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

?q=-title:foo&debug=query

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

(+(-title:foo +MatchAllDocsQuery(*:*))

Ответ 4

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

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

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

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

Ответ 5

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

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