`
fanjf
  • 浏览: 332961 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

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>

分享到:
评论
1 楼 wwwlove1019w 2012-07-24  
这样没办法做到 当session没有相应的值 再去重新搜索 页码没办法跟着变化

相关推荐

    盘古分词、lucene3.0.3搜索的使用示例v1.3.zip

    5. 分页功能是搜索结果展示的重要部分,可以通过调整Query的参数或自定义Scorer来实现。例如,通过设置topN参数限制返回结果的数量,实现每页展示一定数量的搜索结果。 6. 最后,新增的根据分类索引功能可能涉及到...

    lucene_web项目应用实例

    “lucene_web”项目是Lucene与Web服务器的结合,它通过Servlet或者Spring MVC等Web开发框架来接收用户请求,处理搜索查询,并返回相应的搜索结果。项目的结构通常包含以下几个关键部分: 1. **索引构建**:在项目...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-15.Lucene高级进阶1 共23页.pptx

    5. **分页搜索**:由于Lucene的查询特性,需要实现分页查询策略,通常先获取前100条结果,然后根据需要逐页加载更多结果。 6. **排序**:默认情况下,Lucene根据文档得分进行排序。得分计算涉及词频(tf)、倒排...

    Lucene.Net.DemoLib.dll

    3. **结果集处理**:在Lucene.Net.DemoLib.dll中,你可以看到如何获取搜索结果,如何进行相关性评分,以及如何对结果进行排序和分页。 4. **高亮显示**:示例库还涵盖了如何使用高亮器(Highlighter)突出显示查询...

    Lucene in action 2nd Edition MEAP(英文版第二版)

    4. **结果集处理**:讨论如何对搜索结果进行排序、分页和高亮显示,以及如何使用faceting(分面搜索)进行分类和过滤。 5. **高级话题**:涵盖复杂的数据结构如DocValues和Stored Fields,以及倒排索引的压缩技术。...

    solr-jars.zip

    8. **查询和结果处理(Query and Result Handling)**:Solr 提供了丰富的查询语法(如 Lucene 查询语法和 DisMax 请求处理器),并支持对搜索结果进行排序、高亮显示、分页等操作。 9. **Faceting(分类浏览)**:...

    solr学习笔记

    例如,你可以通过 `fq` 过滤出特定时间段内的数据,使用 `sort` 对结果进行排序,通过 `rows` 和 `start` 进行分页,以及利用 `defType` 配合不同的查询解析器来优化查询效率。掌握这些基本知识,将有助于你更高效地...

    ssm唐诗检索系统

    在唐诗检索系统中,MyBatis通过XML或注解的方式配置SQL映射文件,实现数据库查询、插入、更新和删除等操作。在进行唐诗检索时,MyBatis会根据传入的参数动态生成SQL,执行查询,并将查询结果转换为Java对象。 搜索...

    ASP.NET-[搜索链接]Ejear.com多元搜索.zip

    9. **错误处理和日志记录**:确保在搜索过程中捕获和处理可能出现的异常,同时记录日志以供后期分析和调试。 10. **安全考虑**:防止SQL注入攻击,对用户输入进行验证和清理,避免执行恶意SQL。 Ejear.com多元搜索...

    ASP源码—搜索主页.zip

    - 输入处理:用户通过搜索框输入关键词,这些数据由Request对象获取。 - 数据库连接:通常,搜索功能会涉及到数据库查询。ASP可以使用ADODB对象来连接和操作数据库,如SQL Server或Access。 - SQL查询:根据用户...

    dyt-es-jd.zip

    通过阅读源码,了解如何构建 Elasticsearch 的客户端,如何定义索引模板,如何处理索引生命周期管理,以及如何在 SpringBoot 控制器中调用 Repository 进行数据操作。此外,还可以学习如何测试和调试 Elasticsearch ...

    up_267615_SolrPhpClient_owat0.rar

    Apache Solr是一款强大的开源企业级搜索平台,它基于高性能的Lucene Java搜索库,用于处理全文索引、快速高亮显示搜索结果以及提供多种高级搜索功能。 描述提到,通过阅读和研究这些源码,你可以提升自己的PHP编程...

    my_springboot_01.rar

    Elasticsearch是一款基于Lucene的开源全文搜索引擎,具备分布式、RESTful接口、实时性等特点,非常适合处理大量的数据并提供高效的搜索性能。 3. **JPA (Java Persistence API)**:用于操作数据库的ORM(对象关系...

    elastic search-head

    由于GitHub下载速度可能受网络环境影响,不总是稳定快速,因此在获取Elasticsearch-Head时,可以通过其他方式,比如使用Git客户端来下载,以避免下载过程中的困扰。 Elasticsearch 是一个流行的开源全文搜索引擎,...

    ASP.NET源码——文件管理系统源码.zip

    这可能涉及到全文搜索技术,如Lucene.NET,或者利用数据库存储文件信息,然后通过SQL查询来获取结果。 在源码中,开发者可能会使用ASP.NET的控件,如GridView、DetailsView、FileUpload等,来创建交互式的文件列表...

    Elasticsearch组件elasticsearch-head-master

    6. **分页与排序**:对搜索结果进行分页处理,并支持多种排序方式,便于数据浏览。 7. **多语言支持**:Elasticsearch-head界面默认为英文,但可以通过配置支持其他语言,包括中文。 **安装与使用elasticsearch-...

    CrapApi.V7.7-2

    一个由anjularjs+bootstrap+springMVC搭建的免费开源的API接口、文档管理系统(应用接口管理系统) 修改内容: 1.Lucene索引添加项目ID,解决搜索结果调试按钮点击跳转错误的bug 2.添加文章、评论、数据字段、网页的...

    solr实现的搜索引擎

    查询结果可以自定义排序、分页和高亮显示,提升用户体验。 6. **分布式搜索** SolrCloud模式下,Solr支持分布式搜索。多台Solr服务器通过ZooKeeper协调,形成一个分布式集群。数据分布和查询路由由ZooKeeper自动...

    Elasticsearch Java API 手册.zip

    - 结果可通过`getAggregations()`获取。 7. **脚本** - Elasticsearch支持动态脚本,可以在查询和聚合中使用JavaScript或Painless语言执行计算逻辑。 - 脚本可以通过`Script`对象创建,然后在查询或聚合中应用。...

Global site tag (gtag.js) - Google Analytics