如果在JEE的项目中使用了hibernate 作为数据的持久层框架,那么在涉及到数据全文搜索时(fulltext search),如果系统需要对用户输入的关键字进行分析查询,然后得出匹配排序的搜索结果,可以考虑使用hibernate search组件。
一般情况下,你也可以使用hibernate本身提供的DetachedCriteria类来进行多个字段的查询,从而实现全文检索的效果。参考的代码如下:
Junction junction = Restrictions.disjunction()
.add(Restrictions.like(“website”, search, MatchMode.ANYWHERE).ignoreCase())
.add(Restrictions.like(“company”, search, MatchMode.ANYWHERE).ignoreCase())
…
这样可以对表中的所有字段来查询。然而, hibernate在执行这种查询时使用HQL(最后都是使用SQL标准查询语言),这样其实还不是真正意义上的全文检索,而且这种查询会随着字段数量的增加而降低性能。
hibernate意识到这一点,面对互联网搜索引擎的强大检索性能的挑战,高效而易于实现的全文检索是开发数据库应用程序的一个重要需求。hibernate推出了基于lucene search的全文检索集成。
lucene search是apache一个有名的全文索引引擎,其主要的功能是做内容索引及查询服务。详细的技术细节可以参考apache lucene网站,这里不作详细解释了。
要在使用了hibernate框架的项目里使用hibernate search,可以按照以下几个步骤进行:
第一、获得类库及配置
Java 版本为1.5 以上, hibernate 3
你可以到hibernate search官方网站上下载其最新的api (目前版本是3.1.0 GA)
要使用hibernate search,需要在代码中使用到Java1.5支持的Java声明技术,所以你要下载hibernate annotation,这个是hibernate的声明类库。
另外,如果你的Java对象里使用了高级的hibernate集合影射,还需要J2EE包的annotation。
把这些类jar文件放到你的开发、编译及运行环境中。清单如下
# hibernate-search
3.1.0.GA
#hibernate-annotations
3.4.0.GA
#hibernate-entitymanager
3.4.0.GA
#solr-common 可选
1.3.0
#solr-core 可选
1.3.0
#lucene-snowball 可选
2.4.0
接下来配置一下hibernate的properties,有两个基本属性
property name=”hibernate.search.default.directory_provider” value=”org.hibernate.search.store.FSDirectoryProvider”
property name=”hibernate.search.default.indexBase” value=”/var/lucene/indexes”
*这个是指定lucene引擎在索引是产生的索引文件的存放位置
如果你使用了spring框架,你可能需要在对象被创建、更该或删除后hibernate自动更新lucene的索引,你还需要向spring框架里添加event listener,下面是所需的配置参考代码