Не запрос в люцен

Мне не нужно запрашивать мой индекс lucene. В настоящее время Lucene позволяет не только, когда у нас есть два или более условий в запросе:

Поэтому я могу сделать что-то вроде:

country:canada not sweden

но я не могу запустить запрос, например:

country:not sweden

Не могли бы вы сообщить мне, есть ли эффективное решение этой проблемы?

Спасибо

Ответ 1

Очень поздний ответ, но он может быть полезен для кого-то еще позже:

*:* AND NOT country:sweden

ЕСЛИ я не ошибаюсь, это должно сделать логическое "И" со всеми документами и документами со страной, которая отличается от "шведской".

Ответ 2

Пожалуйста, проверьте ответ для аналогичных question. Решение состоит в использовании MatchAllDocsQuery.

Ответ 3

Короткий ответ заключается в том, что это невозможно с помощью стандартной Lucene.

Lucene не разрешает запросы NOT в качестве одного термина по той же причине, что и не позволяет запросам в префиксах - выполнять либо, движок должен будет просматривать каждый документ, чтобы удостовериться, что этот документ не является хитом, Он должен просматривать каждый документ, потому что он не может использовать поисковый запрос в качестве ключа для поиска документов в инвертированном индексе (используется для хранения индексированных документов).

В качестве примера возьмем ваше дело:

Для поиска not sweden самым простым (и, возможно, самым эффективным) подходом было бы поиск sweden, а затем "инвертирование" набора результатов для возврата всех документов, которые не находятся в этом наборе результатов. Для этого потребуется найти все необходимые (т.е. Не в результирующем наборе) документы в индексе, но без ключа, чтобы просмотреть их. Это будет сделано путем итерации по документам в индексе - задача, для которой она не оптимизирована, и, следовательно, скорость будет страдать.

Если вам действительно нужна эта функциональность, вы можете сохранить свой список элементов при индексировании, чтобы поиск not sweden стал поиском sweden с использованием Lucene, а затем инвертировал результаты, используя ваш набор элементов.

Ответ 4

Хорошо, я вижу, что вы пытаетесь сделать.

Вы можете использовать его как уточнение запроса, поскольку в Lucene нет унарных булевых операторов. Несмотря на вышеприведенные ответы, я считаю, что это лучший и наиболее продвинутый подход (отметить пробел перед шаблоном):

&query= *&qf=-country:Canada

Ответ 5

Попробуйте выполнить следующий запрос в поле поиска:

NOT message:"warning"

сообщение является полем поиска