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


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

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

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

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

5 75

5 ответов:

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

-(myField:superneat AND -myOtherField:somethingElse)

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

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

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

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-спасибо!