lucene结果集的分页处理(百度 分页 方式)终于调试通过了。

 

        做一个搜索引擎就要像个样子,做的专业一些才好,因此在分页处理时也采用类似百度和google的分页方式。

       对于结果集的处理,大家各有办法,总结起来就是缓存和重新查询两种方式,lucene推荐第二种,如果使用缓存的方式感觉控制资源的释放比较困难,在并发性较多的情况下系统可能资源耗尽,因此我们这里采用lucene推荐的做法实现类似百度和google的分页效果。

      终于调试通过了,大家可以直接使用了,哪里不清楚可以给我留言。

    <%@ page contentType="text/html; charset=gb2312" buffer="none"%>
<%@ page import="java.util.*"%>

<%
//初始化全局变量
   int totalNum = 0;    //总共记录条数
   int numPerPage = 0;    //每页显示记录条数
   int maxPageNum = 0;   //本次搜索最大页数
   int curPage = 1;      //当前页
   int startLocation = 0;    //起始位置
  
   Vector searchresult = (Vector) session.getAttribute("searchresult");
   
    numPerPage = ((Integer)session.getAttribute("setPageNum")).intValue();

   totalNum = searchresult.size();
   maxPageNum=((totalNum%numPerPage) == 0)?totalNum/numPerPage:(totalNum/numPerPage+1);
   curPage=startLocation/numPerPage + 1;
  
%>

<html>
    <head>
<META http-equiv=Content-Type content="text/html; charset=gb2312">  
   <title>查询结果页面</title>
    <STYLE>
    BODY { MARGIN: 6px 0px 0px; COLOR: #000; BACKGROUND-COLOR: #fff; FONT-FAMILY: arial }
    TABLE { BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px }
    TD { FONT-SIZE: 11pt; LINE-HEIGHT: 18px; FONT-FAMILY: arial; text-align:center}
    .p { PADDING-LEFT: 18px; FONT-SIZE: 14px; WORD-SPACING: 4px }
    #ft { CLEAR: both; BACKGROUND: #e6e6e6; LINE-HEIGHT: 20px; TEXT-ALIGN: center; FONT-SIZE: 12px; COLOR: #77c; FONT-FAMILY: Arial }
   </STYLE>
</head>
<%
  
   if(request.getParameter("startLocation")!=null)
       {
          startLocation = Integer.parseInt(request.getParameter("startLocation"));     //取当前页码
          System.out.println("startLocation ="+startLocation);
          curPage = ((startLocation%numPerPage) == 0)?(startLocation/numPerPage):(startLocation/numPerPage+1);
          curPage=curPage+1;
          System.out.println("curPage ="+curPage);
    }
  
%>
<body>
<form method="POST" >
   <table border="0.5" width="100%" >
     <tr bgcolor="#72963D">
      <td align="center" class="colsTitle" nowrap height="19">
       查询结果
      </td>
     </tr>
   <%
      if(curPage<maxPageNum){
      System.out.println("startLocation="+startLocation);
         for(int i=startLocation; i<startLocation+numPerPage; i++){
             String result = (String) searchresult.elementAt(i);
             out.println("<tr bgcolor=/"#F1F0ED/">");
             out.println("<td align=/"center/" nowrap height=/"19/">");
             out.println(result);
       out.println("</td>");
       out.println("</tr>");
         }
      }else{
         System.out.println("totalNum="+totalNum);
         for(int i=startLocation; i<totalNum; i++){
             String result = (String) searchresult.elementAt(i);
             out.println("<tr bgcolor=/"#F1F0ED/">");
             out.println("<td align=/"center/" nowrap height=/"19/">");
             out.println(result);
       out.println("</td>");
       out.println("</tr>");
         }
      }
    //searchresult.clear();
   %>
   <tr><td>
   <hr align="center" color="#990066" width="500">
   </td>
   <tr>
   <td>
   <%
   if (curPage > 1 ) {
            out.println("<a href='searchresult.jsp?startLocation="+(startLocation-numPerPage));
            out.println("'>上一页</a>");
        }
        if(maxPageNum > 10) {
            int totalNumShow = curPage + 9;
            int startLocationPage = 0;
            if( totalNumShow > maxPageNum) {
                totalNumShow = maxPageNum;
            }
            if( maxPageNum > 11 && curPage > 11) {
                startLocationPage = curPage - 11;
            }
            for(int i=startLocationPage;i<totalNumShow;i++) {
                  if(i+1 == curPage) {
                      %>&nbsp;[<%=i+1%>]&nbsp;<%
                  } else {
                      %><a href="searchresult.jsp?startLocation=<%=i*numPerPage%>">&nbsp;<%=i+1 %>&nbsp;</a><%
                  }
            }
       }
       else {
           for( int i=0;i<maxPageNum;i++) {
                if( i+1 == curPage) {
                    %>&nbsp;[<%=i+1 %>]&nbsp;<%
                } else {
                    %><a href="searchresult.jsp?startLocation=<%=i*numPerPage%>">&nbsp;<%=i+1 %>&nbsp;</a><%
                }
          }
      }

      if ( curPage < maxPageNum) {
           out.println("<a href='searchresult.jsp?startLocation="+(startLocation+numPerPage));
           out.println("'>下一页</a>");
      }
   %>
   </td>
   </tr>
  
   </table>
   </form>
</body>
</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lucene搜索分页过程中,可以有两种方式 一种是将搜索结果直接放到session中,但是假如结果非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样虽然避免了内存溢出的可能,但是,每次搜索都要进行一次IO操作,如果大并发访问的时候,你要保证你的硬盘的转速足够的快,还要保证你的cpu有足够高的频率 而我们可以将这两种方式结合下,每次查询都多缓存一部分的结果,翻页的时候看看所查询的内容是不是在已经存在在缓存当中,如果已经存在了就直接拿出来,如果不存在,就进行查询后,从缓存中读出来. 比如:现在我们有一个搜索结果 一个有100条数据,每页显示10条,就有10页数据. 安装第一种的思路就是,我直接把这100条数据缓存起来,每次翻页时从缓存种读取 而第二种思路就是,我直接从搜索到的结果种显示前十条给第一页显示,第二页的时候,我在查询一次,给出10-20条数据给第二页显示,我每次翻页都要重新查询 第三种思路就变成了 我第一页仅需要10条数据,但是我一次读出来50条数据,把这50条数据放入到缓存当中,当我需要10--20之间的数据的时候,我的发现我的这些数据已经在我的缓存种存在了,我就直接存缓存中把数据读出来,少了一次查询,速度自然也提高了很多. 如果我访问第六页的数据,我就把我的缓存更新一次.这样连续翻页10次才进行两次IO操作 同时又保证了内存不容易被溢出.而具体缓存设置多少,要看你的服务器的能力和访问的人数来决定

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值