`

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;
    }
}
分享到:
评论

相关推荐

    自己写的lucene分页高亮显示代码

    本压缩包中的代码着重展示了如何使用 Lucene 进行分页搜索和结果高亮显示。下面将详细解释这两个关键知识点。 **一、Lucene 分页搜索** 在大型数据集上进行搜索时,一次性返回所有结果并不实际,因此分页搜索显得...

    lucene查询工具类和IndexSearcher分页查询示例

    在本文中,我们将深入探讨如何使用Lucene查询工具类和`IndexSearcher`进行分页查询,这在处理大量数据时尤其有用。Lucene是一个强大的全文搜索引擎库,它提供了高效、可扩展的文本检索功能。在Java开发环境中,...

    lucene查询结果集分页代码

    在lucene搜索分页过程中,可以有两种方式 一种是将搜索结果集直接放到session中,但是假如结果集非常大,同时又存在大并发访问的时候,很可能造成服务器的内存不足,而使服务器宕机 还有一种是每次都重新进行搜索,这样...

    Lucene5学习之分页查询

    本文将深入探讨"Lucene5学习之分页查询"这一主题,结合给定的标签"源码"和"工具",我们将讨论如何在Lucene5中实现高效的分页查询,并探讨其背后的源码实现。 首先,理解分页查询的重要性是必要的。在大型数据集的...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--dic

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    lucene-spatial3d-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-spatial3d-6.6.0.jar; 赠送原API文档:lucene-spatial3d-6.6.0-javadoc.jar; 赠送源代码:lucene-spatial3d-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-spatial3d-6.6.0.pom; 包含...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--news.part2

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part1

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--news.part1

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part3 SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--NewsWithSearch.part2 SSH + Lucene + 分页 + 排序 + 高亮 ...

    SSH + Lucene + 分页 + 排序 + 高亮 模拟简单新闻网站搜索引擎--data

    综上所述,这个项目展示了如何利用SSH框架与Lucene搜索引擎技术,实现一个功能完备的新闻搜索系统,包括高效搜索、结果排序、分页展示以及关键词高亮等特性。这样的系统对于提升新闻网站的用户体验具有重要意义。

    lucene学习资料

    4. **lucene分页.txt** 分页在大型数据集的搜索中非常重要。这份文档可能讲解了如何在Lucene中实现搜索结果的分页显示,包括设置查询范围、控制返回结果的数量等技巧。 5. **Lucene 的学习 .txt** 这是另一份全面...

    lucene第一步---6.分页

    本篇文章将带你迈出使用Lucene的第一步,重点关注如何实现分页检索,这对于构建高效、用户友好的搜索系统至关重要。 Lucene的核心功能包括文档索引、查询解析和结果排序。在分页检索方面,我们需要考虑如何有效地...

    Lucene.net建立索引,检索分页Demo

    **Lucene.net 知识点详解** Lucene.net 是 Apache Lucene 的 .NET 版本,...以上就是关于 Lucene.net 建立索引、检索及分页的关键知识点。理解并熟练运用这些概念,可以帮助开发者构建高效、灵活的全文搜索解决方案。

    lucene的排序过滤和分页.zip

    本资料主要探讨了Lucene中的排序、过滤和分页技术,这些都是构建高效、实用的信息检索系统的重要组成部分。 **排序(Sorting)** 排序是Lucene中的一项核心功能,允许我们根据文档的某个或多个字段来对搜索结果...

    lucence3.6.1 示例完整包

    五、Lucene分页搜索 在实际应用中,通常需要对搜索结果进行分页显示,以改善用户体验。Lucene提供了分页搜索的功能,通过设置TopDocs的参数,我们可以限制返回的结果数量,实现分页效果。此外,ScoreDoc类可以帮助...

    使用Lucene4.7实现搜索功能,分页+高亮

    标题中的“使用Lucene4.7实现搜索功能,分页+高亮”表明我们要讨论的是如何利用Apache Lucene 4.7版本来构建一个具备搜索、分页和高亮显示功能的系统。Lucene是一个高性能、全文本搜索引擎库,它提供了强大的文本...

    对内存中Lucene查询的集合进行分页

    这篇博客文章“对内存中Lucene查询的集合进行分页”探讨的是如何在处理大量数据时,有效地对Lucene查询结果进行分页显示,以提高用户体验并减轻服务器负担。 首先,理解Lucene的基本工作原理至关重要。Lucene通过...

Global site tag (gtag.js) - Google Analytics