【问题标题】:how to achieve pagination in lucene?如何在lucene中实现分页?
【发布时间】:2009-06-08 07:31:57
【问题描述】:

想知道如何在 Lucene 中实现分页,因为它本身并不支持分页。我基本上需要搜索“前 10 个条目”(基于某些参数)然后搜索“下 10 个条目”等等。同时我不希望 Lucene 占用内存。 任何建议将不胜感激。 提前致谢。

【问题讨论】:

标签: lucene


【解决方案1】:

您将需要应用自己的分页机制,类似于以下内容。

 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。

【讨论】:

  • 我同意,Lucene 中的结果没有查询数据库时的结果那么重,因此您可以轻松实现自定义分页方法,而无需处理性能问题
  • 这里的问题是当你搜索具有更高分页数的大数据集时搜索变得越来越慢。这就像你搜索一个东西然后省略了搜索的一部分。
  • 我正在索引日志文件,你觉得使用字段作为行号怎么样?
【解决方案2】:

另一个版本的循环,继续凯恩的代码sn-p;

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

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));
}

【讨论】:

    【解决方案3】:

    我使用以下方式进行分页,可能对某人有所帮助。如果您知道更好的策略,特别是从性能角度来看,请分享。

       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;
        }
    

    【讨论】:

    • 你好 Asif,你能解释一下吗?我想获得所有结果,然后对它们进行分页。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2017-03-07
    • 2021-07-11
    • 2021-11-25
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多