`

lucene 分页

 
阅读更多

 

public class PageBean {

    private int totalData;               //总记录数
    private int pagesize;               //一页记录数
    private int totalPage;               //总页数
    private int currentPage;             //当前页数
    private int showPage;               //显示多少页,默认显示10页,仿谷歌分页
    private int beginPage;              //起始页数
    private int endPage;                //结束页数
    private boolean hasPreviousPage;    //是否有前一页
    private boolean hasNextPage;        //是否有后一页
    private List list;

    public PageBean() {
        pagesize = 5;
        currentPage = 1;
        showPage = 10;
    }

    public int getTotalData() {
        return totalData;
    }

    public void setTotalData(int totalData) {
        this.totalData = totalData;
    }

    public int getPagesize() {
        return pagesize;
    }

    public void setPagesize(int pagesize) {
        this.pagesize = pagesize;
    }

    public int getTotalPage() {
        return totalData % pagesize == 0 ? totalData / pagesize : totalData / pagesize + 1;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public int getShowPage() {
        return showPage;
    }

    public void setShowPage(int showPage) {
        this.showPage = showPage;
    }

    /**
     * 初始化页面中起始和结束页码,注意在setTotalPage()之后调用此方法
     */
    public void initbeginPageAndEndPage() {
        totalPage=getTotalPage();
        //总页数小于6
        if (this.totalPage < (this.showPage / 2) + 1) {
            this.beginPage = 1;
            this.endPage = totalPage;
        } else {
            //总页数大于6,但是当前页数小于6
            if (this.currentPage <= (showPage / 2) + 1) {
                this.beginPage = 1;
                if (this.totalPage >= this.showPage) {
                    this.endPage = this.showPage;
                } else {
                    this.endPage = this.totalPage;
                }
            } else {
                //总页数大于6,且当前页数大于6
                this.beginPage = currentPage - 5;
                this.endPage = currentPage + 4;
                if (this.endPage >= this.totalPage) {
                    this.endPage = this.totalPage;
                }
            }
        }
    }

    public int getBeginPage() {
        return beginPage;
    }

    public void setBeginPage(int beginPage) {
        this.beginPage = beginPage;
    }

    public int getEndPage() {
        return endPage;
    }

    public void setEndPage(int endPage) {
        this.endPage = endPage;
    }

    public boolean isHasPreviousPage() {
        return currentPage!=1;
    }

    public void setHasPreviousPage(boolean hasPreviousPage) {
        this.hasPreviousPage = hasPreviousPage;
    }

    public boolean isHasNextPage() {
        return currentPage!=totalPage;
    }

    public void setHasNextPage(boolean hasNextPage) {
        this.hasNextPage = hasNextPage;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }


}

 

 

 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link href="${pageContext.request.contextPath}/style/reset.css" type="text/css" rel="stylesheet"/>
    <link href="${pageContext.request.contextPath}/style/quoteAnalysis.css" type="text/css" rel="stylesheet"/>
</head>
<body>
<div class="pagination">
    <c:if test="${pageBean.hasPreviousPage}">
        <a href="${pageContext.request.contextPath}/book/bookQuickSearch?currentPage=${pageBean.currentPage-1}${pageURLparam}">上一页</a>
    </c:if>

    <c:forEach begin="${pageBean.beginPage}" end="${pageBean.endPage}" step="1" varStatus="v">
        <a href="${pageContext.request.contextPath}/book/bookQuickSearch?currentPage=${v.index}${pageURLparam}">
            <c:if test="${pageBean.currentPage==v.index}"> <b style="font-color:black"> </c:if>
            [${v.index}]
            <c:if test="${pageBean.currentPage==v.index}"> </b> </c:if>
        </a>
    </c:forEach>

    <c:if test="${pageBean.hasNextPage}">
        <a href="${pageContext.request.contextPath}/book/bookQuickSearch?currentPage=${pageBean.currentPage+1}${pageURLparam}">下一页</a>
    </c:if>
    <input class="txt" type="text" /><input class="btn" type="submit" value="Go"/> 共${pageBean.totalPage}页
</div>
</body>
</html>
 

 

 

 

 

   public class BookQuickSearchService {

    private Logger logger = Logger.getLogger(BookQuickSearchService.class);
    private TopFieldCollector topFieldCollector;
    private IndexSearcher indexSearcher;
    private SearchResult searchResult;
    private QueryParser queryParser;

    public IndexSearcher indexSearcherInstance() throws IOException {
        IndexReader indexReader = IndexReader.open(FSDirectory.open(GenerateBookData.indexFile));
        this.indexSearcher = new IndexSearcher(indexReader);
        return indexSearcher;
    }

    public String queryParserInstance(BookQuickSearchParam bookQuickSearchParam) throws IOException {
        IndexSearcher indexSearcher = indexSearcherInstance();
        String myQueryStr="bookName:"+bookQuickSearchParam.getBooknameQueryStr();
        if("1".equals(bookQuickSearchParam.getMatchType())){
            queryParser = new QueryParser(Version.LUCENE_36, bookQuickSearchParam.getSearchType(), new KeywordAnalyzer());
        }else{
            myQueryStr=myQueryStr+"*";
            if(!StringUtil.isNull(bookQuickSearchParam.getAgeTogether())){
                myQueryStr=myQueryStr+" AND age:"+bookQuickSearchParam.getAgeTogether().replaceAll("_",",");
            }
            queryParser = new QueryParser(Version.LUCENE_36, bookQuickSearchParam.getSearchType(), new SmartChineseAnalyzer(Version.LUCENE_36));
        }

        return myQueryStr;
    }

    public String topScoreDocCollectorInstance(BookQuickSearchParam bookQuickSearchParam) throws IOException {
        String myQueryStr=queryParserInstance(bookQuickSearchParam);
        Sort referenceSort=new Sort(
                new SortField("reference", SortField.INT,"desc".equals(bookQuickSearchParam.getRefTimes())?true:false),
                new SortField("publishDate",SortField.INT,"desc".equals(bookQuickSearchParam.getPublishDate())?true:false)
        );
        this.topFieldCollector = TopFieldCollector.create(referenceSort,indexSearcher.maxDoc(),true,true,true,true);
        logger.info("********************************begin Search***************************************");
        logger.info("搜索【图书-快速搜索-书名】");
        logger.info("主题:"+bookQuickSearchParam.getSearchType());
        logger.info("关键词:"+myQueryStr);
        logger.info("匹配类型:"+("1".equals(bookQuickSearchParam.getMatchType())?"精确匹配":"模糊匹配"));
        long beginTime = System.currentTimeMillis();
        try {
            indexSearcher.search(queryParser.parse(myQueryStr), topFieldCollector);
        } catch (ParseException e) {
            logger.error("解析查询词出错!");
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        searchResultInstance(endTime, beginTime);
        logger.info("一共花费:" + StringUtil.millsecond2Second(endTime - beginTime) + "秒");
        logger.info("一共找到了:" + topFieldCollector.getTotalHits() + "记录");
        return myQueryStr;
    }

    public SearchResult searchResultInstance(long endTime, long beginTime) {
        this.searchResult = new SearchResult();
        searchResult.setTotalHit(topFieldCollector.getTotalHits());
        searchResult.setTakeTime(StringUtil.millsecond2Second(endTime - beginTime));
        return searchResult;
    }

    public List bookQuickSearchPaging(BookQuickSearchParam bookQuickSearchParam, PageBean pageBean) throws IOException {
        List<Book> bookList = new ArrayList<Book>();
        topScoreDocCollectorInstance(bookQuickSearchParam);
        ScoreDoc[] scoreDocs = topFieldCollector.topDocs((bookQuickSearchParam.getCurrentPage() - 1) * pageBean.getPagesize(), pageBean.getPagesize()).scoreDocs;
        for (int i = 0; i < scoreDocs.length; i++) {
            ScoreDoc scoreDoc = scoreDocs[i];
            Book book = doc2book(scoreDoc.doc);
            bookList.add(book);
        }
        if(bookList.size()>0){
            logger.info("【图书-快速搜索-书名】搜索到了以下的图书:");
        }
        for (int i = 0; i < bookList.size(); i++) {
            logger.info("第"+(i+1)+"本:"+bookList.get(i));
        }
        logger.info("********************************end Search***************************************");
        return bookList;
    }


    public Map<String, Integer> bookQuickSearchALl(BookQuickSearchParam bookQuickSearchParam) throws IOException {
         List<Book> bookList = new ArrayList<Book>();
         String myQueryStr=queryParserInstance(bookQuickSearchParam);
         ScoreDoc[] scoreDocs=null;
         TopDocs topDocs=null;
        try {
            topDocs= indexSearcher.search(queryParser.parse(myQueryStr), indexSearcher.maxDoc());
            scoreDocs=topDocs.scoreDocs;
        } catch (ParseException e) {
            logger.error("解析查询词出错!");
            e.printStackTrace();
        }

        Map<String, Integer> bookmap = new TreeMap<String, java.lang.Integer>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });
        for (int i = 0; i < scoreDocs.length; i++) {
            ScoreDoc scoreDoc = scoreDocs[i];
            Document doc = indexSearcher.doc(scoreDoc.doc);
            if(bookmap.containsKey(doc.get("age"))){
                bookmap.put(doc.get("age"),bookmap.get(doc.get("age"))+1);
            }else{
                bookmap.put(doc.get("age"),1);
            }
        }

        return bookmap;
    }

    public Book doc2book(int docid) throws IOException {
        Document doc = indexSearcher.doc(docid);
        Book book = new Book();
        book.setBookid(doc.get("bookid"));
        book.setBookname(doc.get("bookName"));
        book.setAuthor(doc.get("author"));
        book.setPublisher(doc.get("publisher"));
        book.setSubject(doc.get("subject"));
        book.setAge(doc.get("age"));
        book.setClassify(doc.get("classify"));
        book.setReference(doc.get("reference"));
        book.setPublishDate(doc.get("publishDate").substring(0, 4) + "-" + doc.get("publishDate").substring(4));
        book.setISBN(doc.get("ISBN"));
        book.setPage(doc.get("page"));
        book.setRefDocumentPattern(doc.get("refDocumentPattern"));
        return book;
    }

    public TopFieldCollector getTopFieldCollector() {
        return topFieldCollector;
    }

    public void setTopFieldCollector(TopFieldCollector topFieldCollector) {
        this.topFieldCollector = topFieldCollector;
    }

    public IndexSearcher getIndexSearcher() {
        return indexSearcher;
    }

    public void setIndexSearcher(IndexSearcher indexSearcher) {
        this.indexSearcher = indexSearcher;
    }

    public SearchResult getSearchResult() {
        return searchResult;
    }

    public void setSearchResult(SearchResult searchResult) {
        this.searchResult = searchResult;
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics