基于lucene和hibernate的站内全文搜索引擎

来源 :计算机光盘软件与应用 | 被引量 : 0次 | 上传用户:majian198522
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:采用hibernate search技术和lucene技术,设计和实现了基于数据库的站内全文搜索引擎。与基于关键字的搜索和网页搜索相比,能够对搜索内容进行细粒度的搜索控制,查全率和效率也有提高。
  关键词:hibernate search;Lucene;全文搜索
  中图分类号:TP391.3 文献标识码:A文章编号:1007-9599 (2011) 13-0000-02
  Station Full-Text Search Engine Based on Lucene and Hibernate
  Wu Weiguo,Pan Qing
  (Equipment Command Technology College,Beijing101416,China)
  Abstract:Lucene using hibernate search techniques and technology,design and implementation of a database of stations based on full-text search engine.And keyword-based search and Web search,compared to search the content of fine-grained search control,recall and efficiency has been improved.
  Keywords:Hibernate search;Lucene;Full-text search
  本文采用开源的Lucene检索引擎工具包和Hibernate search数据库检索工具设计和实现了一个站内的全文搜索工具,能够显著改善搜索质量。
  一、Lucene技术
  Lucene是开放源代码的一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucenne全文检索的流程可分为索引和搜索两个过程。Lucene中核心概念包括Document和Field。Document代表一种逻辑文件,向Lucene提供要索引的文本内容。Field主要用来标识当前数据源的各种属性,一个Document有多个Field组成。各个Field可以指定不同的索引属性,如是否存储,是否索引,是否分词。
  Lucene的建立索引与搜索过程如下:
  
  图2:Lucene检索过程
  索引过程反向索引(invernted index)技术,完成关键字与文档的反向映射。Lucene提供了几个核心类:Analyzer类进行分词、过滤。IndexWriter类建立倒排索引,索引可以存储在磁盘(FSDirecotry)或内存(RAMDirectory)。Query类完成语法分析,lucene内置了TermQuery、BooleanQuery、RangeQuery、PhaseQuery、MultiPhraseQuery等对象。IndexSearcher类检索索引库,完成搜索相关操作。通过Sort类以及Filter类,还可以对查询结果进行排序、过滤。查询结果以Hits类或者TopDocs类表示。
  二、Hibernate Search技术
  Hibernate Search借用ORM(jpa,hibernate core)技术以及Lucene技术,集成了全文搜索与持久对象模型的优点。Hibernate search有两部分组成:索引组件以及索引搜索组件,两个组件都有Lucene作为后端支持。
  每当数据库字段对应的实体执行插入、更新、删除操作时,Hibernate search通过Hibernate event system跟踪这些事件,调度索引更新操作。
  利用Hibernate Search进行搜索的流程如下:
  1.标注实体类。@Indexed标注代表当前实体类应当被检索,被标注的实体与Lucene中Document建立联系。2.标注对象属性。@Field标注对象的属性,建立对象属性与Lucene Field的关联。由于采用了对象关系映射(ORM),而Lucene的只能索引纯文本类型,因此,需要对属性进行转换,hibernate search提供了转换桥的概念。3.建立索引。通过@Analyzer标注指明要使用的分析器,可以在类或者属性级别。允许用户通过@Analyzer Def自定义分析器。4.构造查询。hibernate query对Lucene Query进行了封装,主要进行内部对象关系映射以及语法分析。查询语句可以指明分页、排序策略查询过滤器Fetching Strategy。5.获取结果集以及结果转换。查询获得的结果并不总是与用户需求类型相同,特别是使用projection时,可以通过Result Transformer进行结果转化。
  三、具体实例的设计与分析
  本文以一个文档系统为例,具体分析基于hibernate search的全文搜索引擎实现。系统采用java EE5平台实现。
  (一)实体类定义如下
  @Entity
  @Indexed
  public class Doc Entry{
  @Id @Document Id private String id;
  @Field(index=Index.TOKENIZED) private String title;
  @Field(index=Index.TOKENIZED) private String excerpt;
  @Field(index=Index.TOKENIZED) private String body;
  @DateBridge(resolution=Resolution.DAY) private Date date=new Date();
  @FieldBridge(impl=PaddedIntegerBridge.class,params=@Parameter(name="padding",value="1"))
  @Field(store=Store.YES) private Integer security;
  @ManyToOne @IndexedEmbedded private User author;
  ……}
  @Id声明了当前POJO对象的主键,与Document中的Document Id的匹配,@Field声明了当前属性与Document中Field的对应关系。@Date Bridge指明date字段应当解析为day表示的字符串。@Indexed Embeded指明将关联的User实体作为当前实体索引的一部分,这样作者名字就可以加入到当前索引。
  
  图3:orm映射与索引示意图
  (二)中文分析器(Analyzer)
  lucene默认的分析器是Standard Analyzer,对中文的支持不够好,这里采用了中文分析器mmseg4j。mmseg4j用Chih-Hao Tsai的MMSeg算法实现的中文分词器。借助slor框架,自定义分析器如下:在mmseg4j分析器基础上,增加了两个过滤器,方便处理英文大小写以及字母声调问题。
  @Analyzer Def(name="my analyzer",
  tokenizer=@Tokenizer Def(factory=com.chenlb.mmseg4j.solr.MMSegTokenizerFactory.class),
  filters={@Token Filter Def(factory=ISOLatin1AccentFilterFactory.class),
  @TokenFilterDef(factory=LowerCaseFilterFactory.class)})
  (三)查询结果过滤器
  Hibernate search允许用户对查询结果进行过滤。出于对安全的考虑,定义了文档的密级,针对不同权限用户能够搜索不同密级的文档。安全过滤通过自定义安全过滤器Security Search Filter实现。过滤的原理是维护一个bit数组,指明每个文档是否能够被检索。
  Boolean Query bquery=new Boolean Query();for(;security>=0;security--){
   Query query=new Term Query(new Term("security",security.to String()));
  bquery.add(query,Boolean Clause.Occur.SHOULD);}
  return new Caching Wrapper Filter(new Query Wrapper Filter(bquery));}
  (四)查询
  本文采用JPA技术,query对象通过Full Text Entity Manager创建。Full Text Entity Manager对Entity Manager进行扩展,加入了搜索相关功能。
  1.时间范围(Range)过滤的实现:
  Ranger Filter filter=new Range Filter(“date”,start Date String,End Date String,true,true);
  query.set Filter(rfilter);
  2.安全级别过滤的实现:
  query.enable Full Text Filter("security").set Parameter("security", priviliage);
  3.排序的实现:
  lucene默认按照文档相关度排序,通过指定sort可以更改排序策略
  Sort sort=new Sort(new Sort Field(sort-topic));
  query.set Sort(sort)//sort-topic指明排序的主题,如title,excerpt…
  4.分页的实现
  query.set First Result(page Size*page);//起始页
  query.set Max Results(paze Size);//页面大小
  query.get Result List();
  四、总结
  本文采用lucene+hibernate search实现了一个基于数据库内的全文搜索引擎。该搜索引擎能够支持常用的搜索方式:范围查询,不同主题排序,查询结果过滤,二次查询等。与百度、google等通用搜索引擎相比,能够搜索更多的信息,以及进行更细粒度的控制搜索内容。与数据库的全文搜索相比,能够显著减轻数据库负担,同时也更灵活高效。lucene只能够对纯文本数据进行索引,所以当前本系统只能够处理纯文本。对于word,pdf等带格式的文本,还需要采用转换桥处理。常用的pdf转化工具有xpdf,word转换工具Apache POI等。要处理这些文件,只需要针对不同文件类型,借助转换工具自定义转换桥类即可。
  参考文献:
  [1]站内搜索.百度百科.http://baike.baidu.com/view/2297577.htm
  [2]阳奇,林镇灿,黄帆,奚建清.基于Hibernate搜索的数据库全文检索系统[A].计算机工程,2010
  [3]邱哲,符滔滔,王学松.开发自己的搜索引擎(Lucene+Heritrix).人民邮电出版社,2009,10
  [4]Hibernate Search Reference Guide3.3.1GA.
  http://docs.jboss.org/hibernate/search/3.3/reference/en-US/html/
  
  
其他文献
二维码技术由于包含数据量大、加密效果好、手机技术识别都优势必将会在防伪等系统中得到较好的应用,本文从基础部分介绍了手机与二维码的在防伪系统中的应用。
总结了宁强县农业污染源普查工作:全县农业利,植业涉及26个乡镇,7万余户,耕地2万余公顷。11种种植模式,常用有机肥,化肥和农药,抽凋农户1649户,登记填表5082张,畜禽养殖场(户)149户,较好
<正>酚妥拉明为α—受体阻滞剂,有血管舒张作用.临床上用于雷诺氏病、手足发绀等疾病.近年来对酚妥拉明药理作用的深入研究表明,在多脏器衰竭(MOF)中应用最为广泛.酚妥拉明可
党的十七届六中全会指出:“推动社会主义文化的大发展大繁荣,队伍是基础,人才是关键。”江阴市委市政府围绕文化强市建设,大力加强基层文化人才队伍建设。目前,全市文化人才队伍规
种子为重要的农业生产资料。肪止种子质量事故和坑农害农事件的发生是种子管理部门的职责。面对全市目前种子市场管理中存在的问题,提出了加强种子市场管理。规范种子市场经营
摘 要:目的 为了培养护生的责任心,在护理教学中采用换位思考教学,分析其应用效果。方法 将2011年6月至2012年6月期间于我院进行实习的98例学生随机分为对照组和研究组各49例,对照组采用传统带教的方法,而研究组在此基础上引入换位思考的理念,比较两组护生的理论成绩、实际操作成绩以及患者的满意度、投诉情况。结果 研究组护生理论成绩、实际操作成绩高于对照组,患者满意度研究组高于对照组,投诉率研究组
针对陕西理工学院北校区地处市郊、交通不便和师生较多的状况,提出了校医院应以师生健康为中心,充分利用现有医疗资源条件,为广大师生做好医疗卫生服务。并对高校医疗服务工作,提