Использование 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 - спасибо!