не запрашивать в люцене

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

Таким образом, я могу сделать что-то вроде:

country:canada not sweden

, но я не могу выполнить такой запрос:

country:not sweden

Не могли бы вы сообщить мне, есть ли какое-нибудь эффективное решение этой проблемы.

Спасибо

12
задан skaffman 30 August 2010 в 22:46
поделиться

2 ответа

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

5
ответ дан 2 December 2019 в 03:48
поделиться

Короткий ответ: это невозможно при использовании стандартного Lucene.

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

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

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

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

1
ответ дан 2 December 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: