Lucene学习笔记之十七:基于searchAfter的实现分页(分页搜索二)

2019-03-28 00:52|来源: lucene菜鸟

先获取上一页的最后一个元素,通过最后一个元素搜索下页的pageSize个元素

public void searchPageByAfter(String query,int pageIndex,int pageSize) {

   try {

       Directory dir = FileIndexUtils.getDirectory();

       IndexSearcher searcher =  getSearcher(dir);

       QueryParser parser = new QueryParser(Version.LUCENE_35,

               "content",new  StandardAnalyzer(Version.LUCENE_35));

       Query q = parser.parse(query);

       

       //先获取上一页的最后一个元素

       ScoreDoc lastSd =  getLastScoreDoc(pageIndex, pageSize, q, searcher);

       //通过最后一个元素搜索下页的pageSize个元素

       TopDocs tds =  searcher.searchAfter(lastSd,q, pageSize);

       for(ScoreDoc sd:tds.scoreDocs) {

           Document doc = searcher.doc(sd.doc);

           System.out.println(sd.doc+":"+doc.get("path")+

                   "-->"+doc.get("filename"));

       }

       searcher.close();

   } catch  (org.apache.lucene.queryParser.ParseException e) {

       e.printStackTrace();

   } catch (IOException e) {

       e.printStackTrace();

   }

}

/**

* 根据页码和分页大小获取上一次的最后一个ScoreDoc

*/

private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,

       Query query,IndexSearcher searcher) throws IOException {

   if(pageIndex==1)return null;//如果是第一页就返回空

   int num = pageSize*(pageIndex-1);//获取上一页的数量

   TopDocs tds = searcher.search(query, num);

   return tds.scoreDocs[num-1];

}


本文链接:Lucene学习笔记之十七:基于searchAfter的实现分页(分页搜索二),转载请注明出处:http://www.javadx.com/article/789

相关问答

更多
  • limit 是mysql的 现在基本用的少了 大多数都是子查询实现的
  • MYSQL现在都支持中文的全文检索为什么不用??match against 对一般的网站来说 速度也不是很慢。。或者你直接上JAVA的lucene
  • lucene search出来的hits数组是所有的相关结果hits的大小就是总记录数,然后设置一个自己要在每页显示的条目数,分页组件应该就能生成你要的结果了显示当前页的条目时,需要自己定位到对应的索引位置上
  • excel怎么分页[2022-02-27]

    文件>打印预览>分页预览>通过鼠标单击并拖动分页符,可调整每页的位置。 注意,虚线是自动生成的分页符,实线是手工强制的分页符 文件>页面设置>工作表>可以设置打印相关的内容,例如重复出现的表头和列头,例如分页的顺序等等。
  • 我不相信你可以创建一个scoredoc然后将它传递给searchAfter。 您需要使用先前搜索返回的ScoreDocs。 I don't believe you can create a scoredoc and then pass it to searchAfter. You need to use the ScoreDocs returned from a previous search.
  • 你必须将搜索到的文本发送到下一页。 您可以将参数添加到链接,如下所示: $paged_result .= ''."\n"; 将其添加到您拥有的每个页面链接: &valueToSearch1='.$valueToSearch1 you have to s ...
  • 我想我得到了答案 如果页面变量不包含数字,则抛出500错误。 并使用filter_var函数从post数组中转义页面变量 但根据php.net filter_var只会验证数据不会将其转换为否。 我在phpfiddle中测试它也返回字符串。 var_dump(filter_var('23',FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_STRIP_HIGH)); 因此,在通过is_numeric比较页面之前,您必须将其转换为可以通过以下方式完成的整数 $page = (i ...
  • 看看这个解释lucene中的分页的博客。 关键在于: int start = 20; int pageSize = 20; Query query = qp.parse(searchTerm); TopDocs hits = searcher.search(query, maxNumberOfResults); for (int i = start; i < start + pageSize && i < hits.Length(); i++) { int docId = hits.sc ...
  • 我也遇到了同样的问题,我认为没有一个简单的答案。 我认为只有两种解决方案。 你所建议的那个有你所描述的性能问题,你必须加载文档并解析每个结果的ACL,然后自己进行分页。 另一种方法是将此工作推送到索引端并在Lucene中索引ACL。 这为您提供搜索性能,通过基于当前用户/组/权限/角色添加过滤器术语来隐藏用户无法看到的结果,但代价是使用ACL信息维护索引。 如果您的ACL很简单,那么这可能是一个选项。 如果您的ACL是分层的,那么它仍然是一个选项,但更复杂。 使用ACL保持索引最新也很棘手。 您开始研究这种 ...
  • 我将展示我自己项目分页的例子。 我确实做了一些评论,但他们是法语,因为我是法语,但我认为他们很容易翻译。 我希望这能帮到您。 我不认为你需要我的''configuraiton.php''这是本地服务器连接,无论如何只是试着理解我的例子。 我和我的搜索是3个标准,这就是为什么我有一个开关和案例。 //This is foncitons.php purpose limit items and create page for pagination