мне нужно не выполнять запросы на моем lucene индекс. В настоящее время Lucene позволяет использовать не только два или более термина в запросе:
Таким образом, я могу сделать что-то вроде:
country:canada not sweden
, но я не могу выполнить такой запрос:
country:not sweden
Не могли бы вы сообщить мне, есть ли какое-нибудь эффективное решение этой проблемы.
Спасибо
Пожалуйста, проверьте ответ на аналогичный вопрос. Решение состоит в том, чтобы использовать MatchAllDocsQuery.
Короткий ответ: это невозможно при использовании стандартного Lucene.
Lucene не разрешает запросы НЕ
в виде одного термина по той же причине, по которой он не разрешает префиксные запросы — для выполнения любого из них движок должен просматривать каждый документ, чтобы убедиться, что документ является/ это не хит. Ему приходится просматривать каждый документ, потому что он не может использовать поисковый термин в качестве ключа для поиска документов в инвертированном индексе (используемом для хранения проиндексированных документов).
Возьмем ваш случай в качестве примера:
Для поиска
not sweden
самым простым (и, возможно, наиболее эффективным) подходом будет поискsweden
, а затем " инвертировать» результирующий набор, чтобы вернуть все документы, которых нет в этом результирующем наборе. Для этого потребуется найти все требуемые (т.е. не входящие в набор результатов) документы в индексе, но без ключа для их поиска. Это можно было бы сделать путем перебора документов в индексе - задача, для которой он не оптимизирован, и, следовательно, пострадает скорость.
Если вам действительно нужна эта функциональность, вы можете вести свой собственный список элементов при индексировании, чтобы поиск не в Швеции
становился поиском в швеции
с использованием Lucene, за которым следовала инверсия. результатов, используя ваш набор элементов.