Ответ 1
Очень поздний ответ, но он может быть полезен для кого-то еще позже:
*:* AND NOT country:sweden
ЕСЛИ я не ошибаюсь, это должно сделать логическое "И" со всеми документами и документами со страной, которая отличается от "шведской".
Мне не нужно запрашивать мой индекс lucene. В настоящее время Lucene позволяет не только, когда у нас есть два или более условий в запросе:
Поэтому я могу сделать что-то вроде:
country:canada not sweden
но я не могу запустить запрос, например:
country:not sweden
Не могли бы вы сообщить мне, есть ли эффективное решение этой проблемы?
Спасибо
Очень поздний ответ, но он может быть полезен для кого-то еще позже:
*:* AND NOT country:sweden
ЕСЛИ я не ошибаюсь, это должно сделать логическое "И" со всеми документами и документами со страной, которая отличается от "шведской".
Пожалуйста, проверьте ответ для аналогичных question. Решение состоит в использовании MatchAllDocsQuery.
Короткий ответ заключается в том, что это невозможно с помощью стандартной Lucene.
Lucene не разрешает запросы NOT
в качестве одного термина по той же причине, что и не позволяет запросам в префиксах - выполнять либо, движок должен будет просматривать каждый документ, чтобы удостовериться, что этот документ не является хитом, Он должен просматривать каждый документ, потому что он не может использовать поисковый запрос в качестве ключа для поиска документов в инвертированном индексе (используется для хранения индексированных документов).
В качестве примера возьмем ваше дело:
Для поиска
not sweden
самым простым (и, возможно, самым эффективным) подходом было бы поискsweden
, а затем "инвертирование" набора результатов для возврата всех документов, которые не находятся в этом наборе результатов. Для этого потребуется найти все необходимые (т.е. Не в результирующем наборе) документы в индексе, но без ключа, чтобы просмотреть их. Это будет сделано путем итерации по документам в индексе - задача, для которой она не оптимизирована, и, следовательно, скорость будет страдать.
Если вам действительно нужна эта функциональность, вы можете сохранить свой список элементов при индексировании, чтобы поиск not sweden
стал поиском sweden
с использованием Lucene, а затем инвертировал результаты, используя ваш набор элементов.
Хорошо, я вижу, что вы пытаетесь сделать.
Вы можете использовать его как уточнение запроса, поскольку в Lucene нет унарных булевых операторов. Несмотря на вышеприведенные ответы, я считаю, что это лучший и наиболее продвинутый подход (отметить пробел перед шаблоном):
&query= *&qf=-country:Canada
Попробуйте выполнить следующий запрос в поле поиска:
NOT message:"warning"
сообщение является полем поиска