示例#1
0
  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;
  }
示例#2
0
  private void hander() {
    if (this.href.indexOf("?") < 0) {
      this.href += "?";
    }
    if ((this.href.endsWith("?")) || (this.href.endsWith("&amp;"))) this.href += "pageIndex=";
    else {
      this.href += "&amp;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>条记录,当前显示第&nbsp;<i class=\"blue\">"
              + pageNumber
              + "&nbsp;</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);
    }
  }
示例#3
0
  /**
   * @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;
  }