Luncene高手帮帮忙,搜索后的结果如何分页?
    如何能使搜索后返回的Hits对象里只包含指定起始位置和数量的结果,比如:指定从所有满足条件的结果中第10条开始,搜索出10条。如果满足搜索条件的结果是100条,要求返回的Hits对象中只包含10-19这10条结果。
    我之前没接触过Luncene,现在工作需要必须用,逼得没办法了,大侠快帮帮我啊!!!

解决方案 »

  1.   

    小弟献丑了。。hits返回的是一个结果集,可以保存到vector中或是其他数据集,
    然后再写一个分页的类,分页的类处理搜索结果显示的条数。可以设置显示的数目。
    ------------------------package pig.html;
    /**
     * 一个分页的类.
     * 和search.jsp一起完成分页的功能.
     */
    import java.util.List;
    import java.util.Vector;public class Pagination {
    private int sumPageNumber;
    private int sumItemNumber;
    private int pageNumber;
    private int showItemNumber;
    private String visitPageURL;
    private String pageHTML; public List interceptListByStarItemNumber(List itemList) {
    int startItem = (pageNumber - 1) * showItemNumber;
    List tpItemList = new Vector();
    if (itemList == null) {
    return null;
    }
    sumItemNumber = itemList.size();
    if (sumItemNumber % showItemNumber == 0) {
    sumPageNumber = sumItemNumber / showItemNumber;
    } else {
    sumPageNumber = sumItemNumber / showItemNumber + 1;
    } for (int i = 0; i < itemList.size(); i++) {
    // 不要超过截取的最大条数,
    if ((i) == (startItem + showItemNumber)) {
    break;
    }
    // 当循环到开始条数的时候,将对象添加到新的列表里面。
    if (i>=startItem) {
    tpItemList.add(itemList.get(i));
    }
    } return tpItemList;
    } public String buildHTML(String tWidth) {
    String tableWidth = tWidth;
    String visitFirstPageURL = "";
    String visitNextPageURL = "";
    String visitPreviousURL = "";
    String visitEndURL = "";
    visitPageURL = visitPageURL + "&showItemNumber=" + showItemNumber
    + "&pageNumber=";
    if (pageNumber == 1) {
    visitFirstPageURL = "[首页]&nbsp;";
    visitPreviousURL = "[上一页]&nbsp;";
    } else {
    visitFirstPageURL = "<a href='" + visitPageURL
    + "1'>[首页]</a>&nbsp; ";
    visitPreviousURL = "<A href='" + visitPageURL + (pageNumber - 1)
    + "'>[上一页]</A>&nbsp;";
    }
    if (pageNumber == sumPageNumber) {
    visitNextPageURL = "[下一页]&nbsp;";
    visitEndURL = "[尾页]&nbsp;";
    } else {
    visitNextPageURL = "<a href='" + visitPageURL + (pageNumber + 1)
    + "'>[下一页]</a>&nbsp;";
    visitEndURL = "<a href='" + visitPageURL + sumPageNumber
    + "'>[尾页]</a>";
    } StringBuffer sb = new StringBuffer();
    sb.append("<table width=" + tableWidth);
    sb.append("><tr><td   align=right>");
    sb.append("当前是第[" + pageNumber + "]页&nbsp;");
    sb.append("共[" + sumPageNumber + "]页&nbsp;" + "共[" + sumItemNumber
    + "]条&nbsp;");
    sb.append(visitFirstPageURL);
    sb.append(visitPreviousURL);
    sb.append(visitNextPageURL);
    sb.append(visitEndURL);
    sb.append("</td>&nbsp;</tr></table>");
    return sb.toString();
    } public int getPageNumber() {
    return pageNumber;
    } public void setPageNumber(int pageNumber) {
    this.pageNumber = pageNumber;
    } public int getShowItemNumber() {
    return showItemNumber;
    } public void setShowItemNumber(int showItemNumber) {
    this.showItemNumber = showItemNumber;
    } public int getSumItemNumber() {
    return sumItemNumber;
    } public int getSumPageNumber() {
    return sumPageNumber;
    } public String getVisitPageURL() {
    return visitPageURL;
    } public void setVisitPageURL(String visitPageURL) {
    this.visitPageURL = visitPageURL;
    } public String getPageHTML() {
    return pageHTML;
    }
    }-------------------------
    上面的类是小弟在做搜索引擎的时候在网上找到的,
    根据自己需要做修改后拿来用了。
      

  2.   

    其实,我也是用分页的办法,从搜索后的结果集中得到指定范围结果。但是这样Hits还是要先返回所有满足条件的结果,我是出于提高效率的考虑,想能不能直接返回既满足搜索条件又满足指定范围的结果。
      

  3.   

    在返回的hits中取出前十条,分页取出第二个十条
    在循环时控制,
      

  4.   

    汗··· Lucene没那么搓 本身有支持分页查询的方法TopScoreDocCollector topCollector = TopScoreDocCollector.create(100, false);
    searcher.search(query, topCollector);
    System.out.println("命中:" + topCollector.getTotalHits());
    // 查询当页的记录  
    ScoreDoc[] docs = topCollector.topDocs((pageNO - 1) * pageSize,pageSize).scoreDocs;