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;
}
}