Я согласен с решением, объясненным Jaimie. Но я хочу указать еще один аспект, о котором вы должны знать, и который помогает понять общий механизм поисковой системы.
С помощью TopDocCollector вы можете определить, сколько ударов вы хотите получить, соответствующий вашему поисковому запросу, прежде чем результат будет отсортирован по результатам оценки или другим критериям сортировки.
Смотрите следующий пример:
collector = TopScoreDocCollector.create(9999, true);
searcher.search(parser.parse("Clone Warrior"), collector);
// get first page
topDocs = collector.topDocs(0, 10);
int resultSize=topDocs.scoreDocs.length; // 10 or less
int totalHits=topDocs.totalHits; // 9999 or less
Мы говорим Lucene здесь, чтобы собрать максимум 9999 документов, содержащих искомую фразу «Clone Warrior». Это означает, что если индекс содержит более 9999 документов, содержащих эту поисковую фразу, сборщик остановится после заполнения 9999 хитов!
Это означает, что чем больше вы выбираете MAX_RESULTS, тем лучше ваш результат поиска. Но это актуально только в том случае, если вы ожидаете большого количества обращений. С другой стороны, если вы ищете «Люк Скайуокер» и вы будете ожидать только один удар, чем MAX_RESULTS также может быть установлен в 1.
Так изменение MAX_RESULTS может повлиять на возвращаемый scoreDocs, как сортировка будет выполняться по собранным хитам. Фактически, MAX_RESULTS должен установить размер, который достаточно велик, чтобы пользователь не мог пропустить определенный документ. Эта концепция полностью противоречит поведению базы данных SQL, которая всегда учитывает полный пул данных.
Но lucene также поддерживает другой механизм. Вы можете вместо определения MAX_RESULTS для коллектора определить количество времени, которое вы хотите подождать для набора результатов. Так, например, вы можете определить, что вы всегда хотите остановить сборщик после 300 мс. Это хороший подход для защиты вашего приложения от проблем с производительностью. Но если вы хотите удостовериться, что вы считаете все соответствующие документы, чем вам нужно установить параметр для MAX_RESULTS или максимальное время ожидания до бесконечного значения.
Привет, Можете ли вы рассказать о разбиении на страницы в lucene 4.x, и я тоже сталкиваюсь с той же проблемой. –
Я использовал подход, описанный в 3-м абзаце выше. Он работает достаточно хорошо, за исключением очень глубокого подкачки (не удивительно). – hudsonb