c# - 分页 Lucene.Net 搜索结果 asp.net

标签 c# lucene.net

我想为 lucene.net 搜索结果做分页。当我从索引中获取数据时,我只需要在每页中获取 10 条记录。所以我搜索了 lucene.net 分页技巧,得到了一个我不清楚的答案。在这里...请看。

Hits hits = searcher.search(query);
int offset = page * recordsPerPage;
int count = Math.min(hits.length() - offset, recordsPerPage);
for (int i = 0; i < count; ++i) {
    Document doc = hits.doc(offset + i);

}

TopDocs topDocs = indexSearcher.Search(query, null, 150);
for(int i=100, i<min(topDocs.totalHits,150); i++) {
Document doc = indexSearcher.doc(topDocs.scoreDocs[i]);

// Do something with the doc
}

我只需要知道是否有更好的技术。请讨论。谢谢

我的更新从这里开始

我用来搜索索引的不同方式。获得您的代码后,我尝试将其合并到我的代码中,但出现错误。请查看我的代码并将其转换为我可以使用您的分页逻辑的方式。

这是我的代码

            int PageIndex=0;
            int PageSize=10;
            searcher = new IndexSearcher(_directory, false);
            Query qry = MultiFieldQueryParser.Parse(Version.LUCENE_29, multiWordPhrase, fieldList, occurs.ToArray(), new StandardAnalyzer(Version.LUCENE_29));
            TopDocs topDocs = searcher.Search(qry, null, ((PageIndex + 1) * PageSize), Sort.RELEVANCE);

            int resultsCount = topDocs.TotalHits;
            lblMatchFound.Text = "Match Found " + resultsCount.ToString();

            List<SearchResult> list = new List<SearchResult>();
            SearchResult oSr = null;


            if (topDocs != null)
            {
                ScoreDoc[] scoreDocs = topDocs.ScoreDocs;
                foreach (ScoreDoc scoreDoc in scoreDocs)
                {
                    Document doc = searcher.Doc(scoreDoc.doc);
                    oSr = new SearchResult();
                    oSr.ID = doc.Get("ID");
                    oSr.Title = doc.Get("Title");
                    oSr.Description = doc.Get("Description");
                    //oSr.WordCount = AllExtension.WordCount(oSr.Description, WordExist(oSr.Title, multiWordPhrase));
                    string preview =
                    oSr.Description = AllExtension.HighlightKeywords(oSr.Description, multiWordPhrase);  //sr.Description;
                    oSr.Url = doc.Get("Url");
                    list.Add(oSr);
                }
            }

请查看并重组我的代码,以便我可以进行分页。谢谢

最佳答案

首先不要使用 Hits 类,因为它已被弃用并且速度很慢。

对于您的寻呼案例:

搜索第一页,如 TopDocs td = s.Search(query, 10);

对于第二页 TopDocs td = s.Search(query, 20); 并显示从 10 到 19 的结果

等等……

PS:Lucene 中开销最大的部分是从索引中读取结果,而不是搜索本身。所以上面的技巧应该表现得很好。

-- 编辑(未测试)--

int page = 2; //starting from 0

TopDocs td = searcher.Search(query, (page+1)*10);
for (int i = page * 10; i < (page + 1) * 10 && i < td.scoreDocs.Length; i++)
{
    Document doc = indexReader.Document(td.scoreDocs[i].doc);
}

关于c# - 分页 Lucene.Net 搜索结果 asp.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11451021/

相关文章:

c# - 按特定顺序对 Lucene.net 搜索结果进行排序

c# - IDisposable 模式片段

c# - 如何遍历匿名对象列表?

date - 使用 Lucene.Net 在两个日期之间搜索

lucene.net - 无法删除 Lucene.Net 上的文档

performance - Lucene 搜索耗时太长

c# - 在 Xamarin.iOS 中为 2 个依赖静态库创建绑定(bind)

c# - 我是否需要释放用作函数参数的托管 BSTR

c# - 如何为数组数据成员定义 get 和 set?

c# - 在 Azure 辅助角色中使用 Lucene.NET 引发未处理的异常