论文部分内容阅读
摘要:采用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/
关键词: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/