Я работаю над запросом solr, подобным следующему:
((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)
При запуске результаты не возвращаются. Использование критериев по обе стороны от ИЛИ НЕ возвращает результаты, которых я ожидал - они просто не работают вместе. В случае, когда MyField соответствует superneat , я намерен также гарантировать , что myOtherField установлен в somethingElse , но если MyField не superneat , включить его в результатах поиска.
Может ли кто-нибудь объяснить, почему solr не возвращает результаты для такого рода запросов? Следует ли как-то реструктурировать запрос - или есть другой способ использования solr для достижения желаемого результата?
-myField:superneat OR myOtherField:somethingElse
это тоже будет то же самое, но немного проще.источник
В настоящее время Solr проверяет наличие «чисто отрицательного» запроса и вставляет
*:*
(который соответствует всем документам), чтобы он работал правильно.-foo
преобразуется solr в(*:* -foo)
Большое предостережение заключается в том, что Solr проверяет только, является ли запрос верхнего уровня чисто отрицательным запросом! Таким образом, это означает, что такой запрос
bar OR (-foo)
не изменяется, поскольку чисто отрицательный запрос находится в подпункте запроса верхнего уровня. Вам необходимо самостоятельно преобразовать этот запрос вbar OR (*:* -foo)
Вы можете проверить объяснение запроса solr, чтобы проверить преобразование запроса:
преобразован в
источник
Собирая вместе комментарии из пары разных ответов здесь, в документации Solr и по другому вопросу SO, я обнаружил, что следующий синтаксис дает правильный результат для моего варианта использования
(my_field = my_value или my_field имеет значение null):
Это работает для solr 4.1.0. Это немного отличается от варианта использования в OP; но я думал, что другие сочтут это полезным.
источник
Вы можете найти продолжение группы пользователей solr в списке рассылки пользователей solr
Преобладает мнение, что оператор NOT может использоваться только для удаления результатов из запроса, а не только для исключения вещей из всего набора данных. Мне нравится синтаксис, который вы предложили mausch - спасибо!
источник
Чтобы добавить еще один неожиданный случай, вот запрос, который не возвращал ожидаемых результатов:
field_b
в моем случае это то, над чем я выполняю фасетирование, и мне нужно было нацелить термин запроса "foo" только на этот тип (панель)Мне пришлось вставить еще одно
*:*
после условия или, чтобы это работало, например:изменить: это в solr 6.6.3
источник
простой do id :( "12345") OR id :( "7890") .... и так далее
источник