public static <T> List<T> searchDocument( Class<T> clazz, Page page, String[] fields, List<String> searchkeyword, List<Integer[]> priceList) throws Exception { if (fields == null || fields.length < 1) { return null; } // 解析分词 // 获取第一个组合数量 // 获取索引目录文件 Directory directory = getDirectory(clazz); if (directory == null) { return null; } // 获取读取的索引 IndexReader indexReader = DirectoryReader.open(directory); // 获取索引的查询器 IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 查询指定字段的转换器 // QueryParser parser = new QueryParser("keywords", analyzer); // String[] str = new String[] { "keywords" }; QueryParser parser = new MultiFieldQueryParser(fields, analyzer); BooleanQuery andQuery = new BooleanQuery(); // 构建多条and查询 for (String _sk : searchkeyword) { Query query = parser.parse(_sk); andQuery.add(query, Occur.MUST); } // 构建between查询 if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(priceList)) { for (Integer[] d : priceList) { Integer l = d[0]; Integer h = d[1]; boolean f = false; if (h > 0) { f = true; } NumericRangeQuery<Integer> numericQuery = NumericRangeQuery.newIntRange("price", l, h, true, f); andQuery.add(numericQuery, Occur.MUST); } } // 需要查询的关键字 // bq.add(query, Occur.SHOULD); TopDocs topDocs = null; int totalCount = indexSearcher.count(andQuery); if (totalCount == 0) { return null; } if (page == null) { topDocs = indexSearcher.search(andQuery, totalCount); } else { // 查询出的结果文档 int _size = 20; if (page != null && page.getPageSize() > 0) { _size = page.getPageSize(); } // 总条数 page.setTotalCount(totalCount); int _max = page.getPageIndex() * (page.getPageIndex() - 1); if (_max - totalCount >= 0) { return null; } // 先获取上一页的最后一个元素 ScoreDoc lastscoreDoc = getLastScoreDoc(page.getPageIndex(), _size, andQuery, indexSearcher); topDocs = indexSearcher.searchAfter(lastscoreDoc, andQuery, _size); } // 查询出的结果文档 ScoreDoc[] hits = topDocs.scoreDocs; if (hits == null || hits.length < 1) { return null; } List<T> list = new ArrayList<T>(hits.length); for (int i = 0; i < hits.length; i++) { Document hitDoc = indexSearcher.doc(hits[i].doc); T t = clazz.newInstance(); for (String fieldName : ClassUtils.getLuceneFields(clazz)) { String fieldValue = hitDoc.get(fieldName); ClassUtils.setPropertieValue(fieldName, t, fieldValue); } list.add(t); } indexReader.close(); directory.close(); return list; }
private void hander() { if (this.href.indexOf("?") < 0) { this.href += "?"; } if ((this.href.endsWith("?")) || (this.href.endsWith("&"))) this.href += "pageIndex="; else { this.href += "&pageIndex="; } Page pageList = (Page) this.pageContext.getRequest().getAttribute(this.data); if (pageList != null) { StringBuffer page = new StringBuffer(); int pageNumber = Integer.valueOf(pageList.getPageIndex()).intValue(); int totalPage = Integer.valueOf(pageList.getTotalPage()).intValue(); int totalRow = Integer.valueOf(pageList.getTotalCount()).intValue(); int startPage = pageNumber - 4; int endPage = pageNumber + 4; if (totalRow == 0) { pageNumber = 0; } if (startPage < 1) { startPage = 1; } if (endPage > totalPage) { endPage = totalPage; } if (pageNumber <= 8) { startPage = 1; } if (totalPage - pageNumber < 8) { endPage = totalPage; } page.append( "<div class=\"pagin \"><div class=\"message\">共<i class=\"blue\">" + totalRow + "</i>条记录,当前显示第 <i class=\"blue\">" + pageNumber + " </i>页</div><ul class=\"paginList\">"); if (pageNumber <= 1) { page.append( "<li class=\"paginItem\"><a href=\"javascript:;\"><span class=\"pagepre\"></span></a></li>"); } if (pageNumber > 1) { page.append( "<li class=\"paginItem\" ><a href=\"" + this.href + (pageNumber - 1) + " \"><span class=\"pagepre\"></span></a></li>"); } if (pageNumber > 8) { page.append("<li class=\"paginItem\" ><a href=\"" + this.href + "1 \">1</a></li>") .append("<li class=\"paginItem\" ><a href=\"" + this.href + "2 \">2</a></li>") .append("<li class=\"paginItem more\"> <a href='#'>...</a></li>"); } for (int i = startPage; i <= endPage; i++) { if (pageNumber == i) page.append("<li class=\"paginItem current\"><a href='#'>" + i + "</a></li>"); else { page.append( "<li class=\"paginItem\"><a href=\"" + this.href + i + " \">" + i + "</a></li>"); } } if (totalPage - pageNumber >= 8) { page.append("<li class=\"paginItem more\"> <a href='#'>...</a></li>") .append( "<li class=\"paginItem\"><a href=\"" + this.href + (totalPage - 1) + " \">" + (totalPage - 1) + "</a></li>") .append( "<li class=\"paginItem\"><a href=\"" + this.href + totalPage + " \">" + totalPage + "</a></li>"); } if (pageNumber == totalPage) page.append("<li class=\"paginItem\"><a href='#'><span class=\"pagenxt\"></span></a></li>"); else { page.append( "<li class=\"paginItem\"><a href=\"" + this.href + (pageNumber + 1) + " \"><span class=\"pagenxt\"></span></a></li>"); } page.append("</ul></div>"); this.output.append(page); } }
/** * @param clazz * @param page * @param fields * @param searchkeyword * @return * @throws Exception */ public static <T> List<T> searchDocument( Class<T> clazz, Page page, String[] fields, String searchkeyword) throws Exception { if (fields == null || fields.length < 1) { return null; } // 获取索引目录文件 Directory directory = getDirectory(clazz); if (directory == null) { return null; } // 获取读取的索引 IndexReader indexReader = DirectoryReader.open(directory); // 获取索引的查询器 IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 查询指定字段的转换器 // QueryParser parser = new QueryParser("keywords", analyzer); // BooleanQuery bq = new BooleanQuery(); QueryParser parser = new MultiFieldQueryParser(fields, analyzer); // 需要查询的关键字 Query query = parser.parse(searchkeyword); // bq.add(query, Occur.SHOULD); TopDocs topDocs = null; int totalCount = indexSearcher.count(query); if (totalCount == 0) { return null; } if (page == null) { topDocs = indexSearcher.search(query, totalCount); } else { // 查询出的结果文档 int _size = 20; if (page != null && page.getPageSize() > 0) { _size = page.getPageSize(); } // 总条数 page.setTotalCount(totalCount); int _max = page.getPageIndex() * (page.getPageIndex() - 1); if (_max - totalCount >= 0) { return null; } // 先获取上一页的最后一个元素 ScoreDoc lastscoreDoc = getLastScoreDoc(page.getPageIndex(), _size, query, indexSearcher); topDocs = indexSearcher.searchAfter(lastscoreDoc, query, _size); } // 通过最后一个元素搜索下页的pageSize个元素 // 查询出的结果文档 ScoreDoc[] hits = topDocs.scoreDocs; if (hits == null || hits.length < 1) { return null; } List<T> list = new ArrayList<T>(hits.length); for (int i = 0; i < hits.length; i++) { Document hitDoc = indexSearcher.doc(hits[i].doc); T t = clazz.newInstance(); for (String fieldName : ClassUtils.getLuceneFields(clazz)) { String fieldValue = hitDoc.get(fieldName); ClassUtils.setPropertieValue(fieldName, t, fieldValue); } list.add(t); } indexReader.close(); directory.close(); return list; }