zoukankan      html  css  js  c++  java
  • Lucene 3.5 提供深度分页支持 searchAfter方法 方法的应用

          最近Lucene项目管理委员会宣布Apache Lucene 3.5.0和Apache Solr 3.5.0已经可以使用。Lucene是一个高性能、支持全文搜索的文本搜索开发库。Solr是一个独立的搜索服务器,其核心使用了Lucene来做索引和搜索。

          Lucene 3.5其中一个最新的特征就是深度分页支持,在之前的版本是提供分页的方法,只能根据自己的应用场景去写分页的方法!在《lucene in action》一书中提现两种分页的方法:1、将首次搜索获得的多页搜索结果收集起来并保存在ScoreDocs和IndexSearcher实例中,并在用户换页浏览时展现这几页的结果。

         2、每次用户换页浏览时都重新进行查询操作。

    按这两个方法是可以做出分页的,只是效果及性能影响大小而已!

         现在Lucene 3.5 加入IndexSearcher.searchAfter方法,它在特定的ScoreDoc之后会返回结果。你可以将上一页的最后一个document传递给searchAfter方法,以得到下一页的结果。

         实例如下:           

    View Code
     1 @Override
    2 public List<BlogsDO> searchBlogsList(String content,String bTypeId,String sDate,String eDate,Page page) throws IOException, ParseException {
    3 List<BlogsDO> blogList=new ArrayList<BlogsDO>() ;
    4 // TODO Auto-generated method stub
    5 TokenStream tokenStream=null;
    6 try{
    7 analyzer = new IKAnalyzer();
    8 //获取IndexSearcher 对象
    9 IndexSearcher indexSearch =commonIndexWriter.getIndexSearcher();
    10 QueryParser queryParser= commonIndexWriter.getQueryParser();
    11 //搜索条件的结合
    12 String str="";
    13 if(StringUtils.isNotEmpty(content)){
    14 str="title:"+content+" content:"+content;
    15 }
    16 if(StringUtils.isNotEmpty(bTypeId) && !bTypeId.equals("-1")){
    17 if(StringUtils.isNotEmpty(str)){
    18 str=str+" AND bTypeId:"+bTypeId;
    19 }else{
    20 str=str+" bTypeId:"+bTypeId;
    21 }
    22 }
    23 if(StringUtils.isNotEmpty(sDate)){
    24 if(StringUtils.isNotEmpty(str)){
    25 str=str+" AND gmt_create:["+sDate+" TO "+eDate+"]";
    26 }else{
    27 str=str+" gmt_create:["+sDate+" TO "+eDate+"]";
    28 }
    29 }
    30 //设置搜索条件
    31 Query query=queryParser.parse(str);
    32 //查询搜索引擎
    33 TopDocs result = indexSearch.search(query, 10);
    34 //上一页的最后一个document索引
    35 int index=(page.getCurrentPage()-1)*page.getPerPageSize();
    36 ScoreDoc scoreDoc=null;
    37 //如果当前页是第一页面scoreDoc=null。
    38 if(index>0){
    39 //因为索引是从0开始所以要index-1
    40 scoreDoc=result.scoreDocs[index-1];
    41 }
    42 //分页处理
    43 TopDocs hits= indexSearch.searchAfter(scoreDoc, query, page.getPerPageSize());
    44 //设置分页的总记录数
    45 page.setCounts(hits.totalHits);
    46 BlogsDO blog=null;
    47 //循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值
    48 for (int i = 0; i < hits.scoreDocs.length; i++) {
    49 ScoreDoc sdoc = hits.scoreDocs[i];
    50 Document doc = indexSearch.doc(sdoc.doc);
    51 blog=new BlogsDO();
    52 String title=doc.get("title");
    53 String mark=doc.get("content");
    54 //加亮处理
    55 SimpleHTMLFormatter simplehtml=new SimpleHTMLFormatter("<font color='red'>", "</font>");
    56 Highlighter highlighter = new Highlighter(simplehtml,new QueryScorer(query));
    57 if(title!=null){
    58 tokenStream = analyzer.tokenStream("title",new StringReader(title));
    59 String highLightText = highlighter.getBestFragment(tokenStream, title);
    60 blog.setTitle(highLightText==null?title:highLightText);
    61 }else{
    62 blog.setTitle(title);
    63 }
    64 //加亮处理
    65 if(mark!=null){
    66 tokenStream = analyzer.tokenStream("content",new StringReader(mark));
    67 String highLightText = highlighter.getBestFragment(tokenStream, mark);
    68 blog.setContent(highLightText==null?mark:highLightText);
    69 }else{
    70 blog.setContent(mark);
    71 }
    72 blog.setBlogsId(Integer.valueOf(doc.get("blogsId")));
    73 blog.setNickName(doc.get("nickName"));
    74 blog.setbTypeId(doc.get("bTypeId"));
    75 blog.setbTypeName(doc.get("bTypeName"));
    76 blog.setRevDate(doc.get("gmt_create"));
    77 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    78 blog.setGmtCreate(sdf.parse(doc.get("gmt_create")));
    79 blogList.add(blog);
    80 }
    81 indexSearch.close();
    82 }catch (java.text.ParseException e) {
    83 // TODO Auto-generated catch block
    84 e.printStackTrace();
    85 }catch (InvalidTokenOffsetsException e) {
    86 // TODO Auto-generated catch block
    87 e.printStackTrace();
    88 }
    89 return blogList;

     Lucene 3.5 在学习中,请多多指教!呵呵!


  • 相关阅读:
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    OA办公系统 Springboot Activiti6 工作流 集成代码生成器 vue.js 前后分离 跨域
    java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    java 视频播放 弹幕技术 视频弹幕 视频截图 springmvc mybatis SSM
    最后阶段总结
    第二阶段学习总结
    第一阶段学习总结
  • 原文地址:https://www.cnblogs.com/yuanermen/p/2343993.html
Copyright © 2011-2022 走看看