использование или и не в запросе solr
Я работаю над запросом solr, похожим на следующее:
((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)
при выполнении этого, результаты не возвращаются. Использование критериев с обеих сторон или не возвращает результаты, которые я ожидал бы - они просто не работают хорошо вместе. В том случае, если myField игр superneat, Я намерен также убедиться, что myOtherField установлено значение somethingElse, а если myField не superneat, включить его в результаты.
может кто-нибудь объяснить, почему solr не возвращает результаты для такого рода запросов? Должен ли запрос быть каким - то образом реструктурирован-или есть другой способ, которым solr можно использовать для достижения желаемого результата?
5 ответов:
Я не знаю, почему это не работает, но это логически эквивалентно и это тут работы:
-(myField:superneat AND -myOtherField:somethingElse)
возможно, это как-то связано с определением одного и того же поля дважды в запросе...
попробуйте спросить в solr-группа пользователей, затем отправьте сюда окончательный ответ!
Solr в настоящее время проверяет "чистый отрицательный" запрос и вставляет
*:*
(который соответствует всем документам), чтобы он работал правильно.
-foo
преобразуется solr в(*:* -foo)
большая оговорка заключается в том, что Solr проверяет только, является ли запрос верхнего уровня чистым отрицательным запросом! Так что это означает, что запрос, как
bar OR (-foo)
не изменяется, так как чистый отрицательный запрос находится в подпункте запроса верхнего уровня. Вам нужно преобразовать этот запрос самостоятельноbar OR (*:* -foo)
вы можете проверить объяснение запроса solr, чтобы проверить преобразование запроса:
?q=-title:foo&debug=query
превращается в
(+(-title:foo +MatchAllDocsQuery(*:*))
собирая комментарии из нескольких разных ответов здесь, в документах Solr и на другом вопросе SO, я обнаружил, что следующий синтаксис дает правильный результат для моего варианта использования
(my_field=my_value или my_field равно null):
(my_field:"my_value" OR (*:* NOT my_field:*))
это работает для solr 4.1.0. Это немного отличается от варианта использования в OP; но я думал, что другие найдут его полезным.
вы можете найти последующие действия для группы пользователей solr: solr user mailling list
преобладающая мысль заключается в том, что оператор NOT может использоваться только для удаления результатов из запроса, а не только для исключения вещей из всего набора данных. Мне нравится синтаксис, который вы предложили mausch-спасибо!