Lucence-分页/排序/多字段/高亮

Lucence

1、分页

oracle中10-19条记录的sql语句

select * from ( select g.*,rownum as rn from goods g where  rownum<20) g1 where g1.rn>9

示例:

public List<Goods> queryPage(String name,int pageIndex,int pageSize) {

      List<Goods>goodses = new ArrayList<Goods>();

      IndexSearchersercher=null;

      if(pageIndex<1){

         pageIndex=1;

      }

      //查询页的开始记录数的序号

      int startRecord = (pageIndex-1)*pageSize;

      //查询页的结束记录数序号

      int endRecord = pageIndex*pageSize;

     

      try {

 

          sercher = new IndexSearcher(Configuration.getDIRECTORY());

         // 查询解析器,参数一:版本号,一般选择最高,参数二:需要查询的字段名,参数三:解析器

         QueryParser parset = new QueryParser(Configuration.LOCAL_VERSION,

                "goodsName", Configuration.ANALYZER);

         // 把查询关键字(term)交给查询解析器

         Query query = parset.parse(name);

        

         // 查询索引库,参数一:指定的查询解析器,参数二:指定返回记录条数

         TopDocstopDosc = sercher.search(query, endRecord);

 

         System.out.println("实际在库中匹配的总记录数:" + topDosc.totalHits);

         if(topDosc.totalHits<=startRecord){

            System.out.println("没有记录了!");

            return null;

         }

         if(endRecord>topDosc.totalHits){

            endRecord=topDosc.totalHits;

         }

        

         ScoreDoc[]scoreDocs = topDosc.scoreDocs;

         System.out.println("返回的记录数ID总数:" + scoreDocs.length);

 

         for (int i=startRecord;i<endRecord;i++) {

            System.out.println("当前的文档积分为:" + scoreDocs[i].score + ",当前的文档编号为:"

                   +scoreDocs[i].doc);

            // 根据文档编写查询真正的文档对象

            Document document = sercher.doc(scoreDocs[i].doc);            

            Goodsgoods = (Goods) BeanUtils.documentToBean(document,

                   Goods.class);

            System.out.println("page 内容:"+goods);

            goodses.add(goods);

         }

      } catch (Exception e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }finally{

         try {

            sercher.close();

         }catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

         }

      }

      return goodses;

   }

2、排序与多字段查询

public List<Goods> queryGoodsListUseSort(String queryWord) {

 

      List<Goods> goodses = new ArrayList<Goods>();

      IndexSearcher indexSearcher = null;

      try {

         indexSearcher = new IndexSearcher(Configuration.getDIRECTORY());

        

         //创建排序字段,参数一:指定排序字段;参数二:字段类型;参数三:设置升序或子降序,true为降序

         SortField goodsId = new SortField("goodsId",SortField.INT,true);

         //创建排序字段,默认为升序

         SortField goodsPrice = new SortField("goodsPrice", SortField.DOUBLE);

        

         Sort sort = new Sort();

         //设置排序字段到sort对象中,排序的优先级,前者优先于后者

         sort.setSort(goodsId,goodsPrice);       

        

         //使用IKQueryParser进行多字段数据查询

         Queryquery = IKQueryParser.parseMultiField(newString[]{"goodsName","goodsRemark"},queryWord);

        

         //执行查询,返回20条记录,加入排序设置信息

         TopDocs topDocs = indexSearcher.search(query, null,20,sort);

        

         System.out.println("共匹配的记录:" + topDocs.totalHits);

 

         ScoreDoc[] scoreDoces = topDocs.scoreDocs;

         for (ScoreDoc scoreDoc : scoreDoces) {

            System.out.println("score:" + scoreDoc.score + "|doc:"

                   +scoreDoc.doc);

            Documentdocument = indexSearcher.doc(scoreDoc.doc);

            Goodsgoods = (Goods) BeanUtils.documentToBean(document,

                   Goods.class);

            goodses.add(goods);

         }

 

      } catch (Exception e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }finally{

         try {

            indexSearcher.close();

         }catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

         }

      }

 

      return goodses;

   }

3、高亮

public List<Goods> queryGoodsListReturnHighLight(String queryWord) {

 

      List<Goods> goodses = new ArrayList<Goods>();

      IndexSearcher indexSearcher = null;

      try {

         indexSearcher = new IndexSearcher(Configuration.DIRECTOTY);

        

         //创建排序字段,参数一:指定排序字段;参数二:字段类型;参数三:设置升序或子降序,true为降序

         SortField goodsId = new SortField("goodsId",SortField.INT,true);

         //创建排序字段,默认为升序

         SortField goodsPrice = new SortField("goodsPrice", SortField.DOUBLE);

        

         Sort sort = new Sort();

         //设置排序字段到sort对象中,排序的优先级,前者优先于后者

         sort.setSort(goodsId,goodsPrice);       

        

         //使用IKQueryParser进行多字段数据查询

         Queryquery = IKQueryParser.parseMultiField(new String[]{"goodsName","goodsRemark"},queryWord);

        

         //执行查询,加入排序设置信息

         TopDocs topDocs = indexSearcher.search(query, null,20,sort);

        

         System.out.println("共匹配的记录:" + topDocs.totalHits);

 

         ScoreDoc[]scoreDoces = topDocs.scoreDocs;

         for (ScoreDoc scoreDoc : scoreDoces) {

            System.out.println("score:" + scoreDoc.score + "|doc:"

                   +scoreDoc.doc);

            Documentdocument = indexSearcher.doc(scoreDoc.doc);

           

            //设置高亮的格式

            Formatter formatter = new SimpleHTMLFormatter("<font color='red'>","</font>");

            //指定查询信息

            Scorer scorer = new QueryScorer(query);

           

            Highlighter highlighter = new Highlighter(formatter, scorer);

            //指定高亮后的长度,需要SimpleFragmenter类型参数,这里指定长度为20

            highlighter.setTextFragmenter(newSimpleFragmenter(20));

            //设置对哪个字段进行高亮操作,返回高亮后的结果

            String nameResult = highlighter.getBestFragment(Configuration.ANALYZER,"goodsName", document.get("goodsName"));

            String remarkResult = highlighter.getBestFragment(Configuration.ANALYZER,"goodsRemark", document.get("goodsRemark"));

 

            System.out.println("namereuslt"+nameResult);

            System.out.println("remarkreuslt"+remarkResult);

 

            //把高亮后的值重新赋给字段,如果没有高亮,将使用原值

            if(nameResult!=null){

                document.getField("goodsName").setValue(nameResult);

            }else{

               if(document.get("goodsName")!=null&&document.get("goodsName").length()>=20){

                  document.getField("goodsName").setValue(document.get("goodsName").substring(0,20));

                }else{

                   document.getField("goodsName").setValue(document.get("goodsName"));

               }

            }

            if(remarkResult!=null){

                document.getField("goodsRemark").setValue(remarkResult);

            }else{

            if(document.get("goodsRemark")!=null&&document.get("goodsRemark").length()>=20){

                document.getField("goodsRemark").setValue(document.get("goodsRemark").substring(0,20));

                }else{

                   document.getField("goodsRemark").setValue(document.get("goodsRemark"));

                }

            }

                  

            Goodsgoods = (Goods) BeanUtil.DocumentToBean(document,

                   Goods.class);

            goodses.add(goods);

         }

 

      } catch (Exception e) {

         // TODO Auto-generated catch block

         e.printStackTrace();

      }finally{

         try {

            indexSearcher.close();

         }catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

         }

      }

 

      return goodses;

   }

猜你喜欢

转载自blog.csdn.net/chenzuyibao/article/details/80628297