как добиться нумерации страниц в люцене? - PullRequest
20 голосов
/ 08 июня 2009

Хотите знать, как добиться нумерации страниц в Lucene, так как он не поддерживает разбиение на страницы? Мне в основном нужно искать «10 лучших записей» (на основе какого-либо параметра), затем «следующие 10 записей» и так далее. И в то же время я не хочу, чтобы Lucene наполнила память. Любой совет будет оценен. Заранее спасибо.

Ответы [ 3 ]

20 голосов
/ 08 июня 2009

Вам нужно будет применить свой собственный механизм подкачки, примерно такой, как показано ниже.

 IList<Document> luceneDocuments = new List<Document>();

 IndexReader indexReader = new IndexReader(directory);
 Searcher searcher = new IndexSearcher(indexReader);

 TopDocs results = searcher.Search("Your Query", null, skipRecords + takeRecords);
 ScoreDoc[] scoreDocs = results.scoreDocs;

 for (int i = skipRecords; i < results.totalHits; i++)
 {
      if (i > (skipRecords + takeRecords) - 1)
      {
           break;
      }

      luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc));
 }

Вы обнаружите, что итерация массива ScoreDocs будет легкой, поскольку данные, содержащиеся в индексе, фактически не используются, пока не будет вызван метод searcher.Doc.

Обратите внимание, что этот пример был написан для слегка измененной версии Lucene.NET 2.3.2, но основной принцип должен работать против любой последней версии Lucene.

12 голосов
/ 24 января 2012

Другая версия цикла, продолжая фрагмент кода Кейна;

....................

ScoreDoc[] scoreDocs = results.scoreDocs;
int pageIndex = [User Value];
int pageSize = [Configured Value];

int startIndex = (pageIndex - 1) * pageSize;
int endIndex = pageIndex * pageSize;
endIndex = results.totalHits < endIndex? results.totalHits:endIndex;

for (int i = startIndex ; i < endIndex ; i++)
{
     luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc));
}
5 голосов
/ 29 декабря 2014

Я использую следующий способ для разбивки на страницы, может быть, это поможет кому-то. Если вы знаете лучшую стратегию, особенно с точки зрения производительности, пожалуйста, поделитесь.

   public TopDocs search(String query, int pageNumber) throws IOException, ParseException {
        Query searchQuery = parser.parse(query);
        TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);

        int startIndex = (pageNumber - 1) * MyApp.SEARCH_RESULT_PAGE_SIZE;
        searcher.search(searchQuery, collector);

        TopDocs topDocs = collector.topDocs(startIndex, MyApp.SEARCH_RESULT_PAGE_SIZE);
        return topDocs;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...