电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> JSP教程
使用Lucene进行全文检索(三)---进行搜索-JSP教程,资料/其它
作者:网友供稿 点击:48
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

关键字:lucene,html parser,全文检索,indexreader,document,field,indexwriter,term,htmlpage


 无论是建立索引还是分析内容,都是为了用户的搜索服务.
 
 在lucene中,如果需要使用搜索,需要使用searcher类,这是一个抽象类,它有2个子类:indexsearcher和multisearcher.
 
 indexsearcher是对一个索引进行搜索,如果你需要对多个索引进行搜索,可以使用multisearcher.下面的内容只介绍了indexsearcher.
 
 搜索涉及到几个问题:分页,组合条件,根据条件过滤,排序等等.
 
 分页:分页在记录列表的地方都会遇到,这里不在赘述,我也实现过一个保存分页结果和显示结果的类,用于自己的实际工作,下面也会用到保存分页结果的类,代码如下:

  package com.jscud.support;
  
  
  /**
   * 分页显示用的参数.
   *
   * @author scud(飞云小侠) http://www.jscud.com
   * 
   */
  
  public class divpageinfo
  {
  
      //开始记录数
      private int recstart;
  
      //结束记录数
      private int recend;
  
      //总页数
      private int pagecount;
  
      //当前页
      private int page;
  
      //记录总数
      private int reccount;
     
      //每页记录数
      private int perpagerows;
  
      public int getnicepagecount()
      {
          return getnicepagenum(pagecount);
      }
     
      //get,set等,不在列出
      //......
  
     
      /**
       * 得到友好的页数数字,页数为0时,返回1.
       *
       * @return 得到友好的页数
       */
      public static int getnicepagenum(int npage)
      {
              if (npage == 0)
              {
                      return 1;
              }
              else
              {
                      return npage;
              }
      }   
  } 

 显示分页结果的类就需要大家根据自己使用的框架来具体实现了.我使用的是webwork.
 
 组合条件:在lucene中,搜索的条件可以组合的很复杂,相关的类有booleanquery, filteredquery, multitermquery, phraseprefixquery, phrasequery, prefixquery, rangequery, spanquery, termquery 等等,从而可以组合出很复杂的条件用于查询.
 另外queryparser可以根据用户输入的字符串和设定的解析器和字段设置等,可以自动产生新的组合条件用于查询,例如用户输入"john and black",queryparser可以自己分析出用户是需要查询字段中同时包含"john"和"black"的结果.
 
 过滤条件:有时候根据具体的用户需求,有些记录对于一些用户是不可见的,此时就要使用过滤器来防止不合法的用户看到不应该看到的记录.过滤器同时也可以根据一些具体的条件来过滤掉一些用户不想看到的记录.如果需要实现自己的filter,只要参考queryfilter,datefilter实现filter即可.
 
 排序:有时候,可能需要根据某个字段进行排序,例如按照时间排序.当然更多的时候是按照搜索结果的符合度进行排序,lucene默认的排序就是按照符合度来进行排序的.
 
 进行搜索的代码如下,根据自己的需要进行代码的修改:
 

 /**
 * 进行搜索.
 *
 * 参数依次为:搜索内容(支持lucene语法),当前页,每页记录数,分页信息对象
 *
 */
    public static list search(string searchtext, int page, int perpage, final divpageinfo pageinfo)
    {
        list docs = new arraylist();
       
        if(!lucenesearch.indexexist(indexdir)) { return docs; }

        searcher searcher = null;
        try
        {
            standardanalyzer analyzer = new standardanalyzer();

            //处理检索条件
            query titlequery = queryparser.parse(searchtext, "title", analyzer);
            query contextquery = queryparser.parse(searchtext, "content", analyzer);
            query otherquery = queryparser.parse(searchtext, "other", analyzer);

            booleanquery query = new booleanquery();
            query.add(titlequery, false, false);
            query.add(contextquery, false, false);
            query.add(otherquery, false, false);

            //分页检索
            searcher = new indexsearcher(indexdir);
            hits hits = searcher.search(query);

            divpageinfo.divpage(hits.length(), perpage, page, pageinfo);

            //取出当前页的记录
            for (int i = pageinfo.getrecstart(); i <= pageinfo.getrecend(); i++)
            {
                docs.add(lucenedocument.getdocument(hits.doc(i - 1)));
            }
        }
        catch (ioexception e)
        {
            logman.error("error occur when search lucene", e);
        }
        catch (parseexception e)
        {
            logman.error("error occur when search lucene", e);
        }
        finally
        {
            try
            {
                if (null != searcher)
                {
                    searcher.close();
                }
            }
            catch (ioexception e)
            {
                logman.warn("close searcher error");
            }
        }

        return docs;
    }



 
 代码中出现了一个新的类hits,hits是lucene的搜索结果集,是lazy load的结果集,只有你真正访问它,它才去装载真正的数据.
 
 代码中还出现了一个lucenedocument,这是为了在页面中显示而写的一个辅助类,因为lucene的document是final的,无法进行扩展,而要显示时间字段必须要调用datefield中的函数,这样在页面中显示就不太直观了,所以写了这个辅助类,代码如下:
 

  package com.jscud.www.support.search;
  
  import java.sql.timestamp;
  import java.util.date;
  
  import org.apache.lucene.document.datefield;
  import org.apache.lucene.document.document;
  import org.apache.lucene.document.field;
  
  /**
   * 对lucene的document的封装,用于显示目的.
   *
   * @author scud(飞云小侠) http://www.jscud.com
   *
   */
  public class lucenedocument
  {
      private document doc;
     
      public lucenedocument(document doc)
      {
          this.doc = doc;
      }
     
      public static lucenedocument getdocument(document doc)
      {
          return new lucenedocument(doc);
      }
     
      public string getvalue(string name)
      {
          return doc.get(name);
      }
     
      public field getfield(string name)
      {
          return doc.getfield(name);
      }
     
      public timestamp getdatetime(string name)
      {
          string value = doc.get(name);
          return new timestamp( datefield.stringtotime(value));
      }
     
      public date getdate(string name)
      {
          string value = doc.get(name);
          return  datefield.stringtodate(value);       
      }    
  }


 
 使用webwork对结果集进行了显示,代码如下:

          <ww:iterator value="docs">
          <tr >         
          <td>
          <a href="<jscud:contextpath /><ww:property  value="getvalue(visiturl)" />"  target="_blank" >
          <ww:property value="getvalue(title)" escape="true" />
          </a> &nbsp; (<jscud:datetime value="getdatetime(addtime)" />)
          </td>
          </tr>
          </ww:iterator> 
  



 然后调用分页信息显示tag即可.
 
 
 通过以上的应用,可以看到,其实使用lucene很简单,以前总觉得很神秘,所以一直没有使用过,用过之后才觉得如此简单.
 
 
 当然,对于大容量数据下,群集情况下,在网上都有很多解决方案,在此不一一提出,感兴趣的读者可以自己去搜索. :)



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·IReport与JasperReport开发详解一-JSP教程,Java技巧及代码
·JSTL(JSP标准标签库)介绍-JSP教程,资料/其它
·格式化输入日期时间控件 JieFormattedDateBox-JSP教程,Java技巧及代码
·JSTL简化JSP编码-JSP教程,Jsp/Servlet
·JUnit和单元测试入门简介-JSP教程,Java技巧及代码
·从数据库中读取一个图片并保存为一个图片文件-JSP教程,数据库相关
·Java Swing入门基础-JSP教程,Java技巧及代码
·IntelliJ IDEA培训-JSP教程,Java技巧及代码
·通过JSP的预编译消除性能瓶颈-JSP教程,Jsp/Servlet
·Java中利用JMF编写摄像头拍照程序-JSP教程,Java技巧及代码

最新文章
·J2ME中的时间处理方法
·J2ME播放声音流程简介
·J2ME开发之手机键盘使用注意问题
·J2ME 记录管理存储
·MVC模式在j2me项目中的应用(二)
·MVC模式在j2me项目中的应用(一)
·J2ME中使用记录存储系统(RMS)存储信息
·J2ME与MIDP开发(1)
·用简单的J2ME程序测试MIDlet的生命周期
·JAVA基础:提升JSP应用程序的七大绝招


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号