Hibernate Search

来源:互联网 发布:知有儿童挑促织 编辑:程序博客网 时间:2024/05/24 22:44

 

Hibernate Search



Hibernate Search是Hibernate的子项目,把数据库全文检索能力引入到项目中,并通过"透明"(不影响既有系统)的配置,提供一套标准的全文检索接口。

全文检索的概念

在进入正文之前,有必要介绍一下全文检索的概念。简单来说,Google就是一个全文检索引擎。全文检索允许用户输入一些关键字,从数据层中查找到所需要的信息。此外全文检索和数据库"LIKE"语句相比,没有数据库开销或是数据库的开销非常小,因为检索过程全部从通过检索文件完成,因此效率非常高。此外,全文检索引擎可以提供的还远不止"LIKE"语句这么多。在全文检索领域,用户输入的搜索信息叫做关键字,而全文检索系统把海量信息按照这些关键字进行结构化处理,把文章打散成段落、文字,最后,按关键字对文章的数据进行分类。这个处理后的数据文本叫做检索文件,检索文件往往比实际数据小得多,但它的数据所包含的信息量损失却非常小。当用户输入一个关键字时,全文检索引擎可以很快地定位到相关文本。

什么是Lucene

Lucene是一个开源的全文检索引擎,目前已经成为了Apache基金会赞助项目。Lucene是Java社区非常流行的全文检索引擎,功能强大。它不仅可以检索一般的数据文本,还可以检索PDF、HTML及微软的Word文件等。此外,Lucene成功的原因之一是它开放的框架,几乎框架的每一部分都可以扩展。它的文本分析器可以定制,检索文件存储方式可以定制,查询引擎也有不同的可选方案,如果愿意,还可以自已定制。此外,它提供一套非常强大的API接口,使客户用起来很方便。此外,Lucene除支持非结构化检索\footnote{用户输入一个关键字,全文检索引擎去匹配任何字段包含该关键字的数据条目。}外,还支持结构化检索(用户可以指定具体搜索的model类、字段名以及搜索条件)。这章的重点不是Lucene,但做为Hibernate Search的核心,您有必要对它的基本概念有所了解。下面介绍一些Lucene中的基本概念:

  • Document:在Lucene中,一个Document即一个搜索单元。举例来说:如果对一个用户表做检索,那么每条用户信息就是一个Document。
  • Field:每一个Document都包含一或多个Field,每一个Field都是key-value数据对。
  • Analyzer:分析器/断字器。这是全文检索引擎的心脏,如何将一篇文章打散成一些关键字,并能够不丢失信息量,这是一门单独的学科。Lucene提供多种Analyzer,并提供开放的接口让社区的专家提供新的Analyzer。
  • Index:系统生成的检索信息,这里面存储了Document。
  • IndexSearcher:IndexSearcher负责检索Index内容负责给出检索结果。
  • IndexWriter:IndexWriter负责调用Analyzer,分析后生成Index。

Lucene、Hibernate Search及Hibernate的联系

如果在本项目中直接使用Lucene,将不得不面临一些问题。因为本项目是基于数据库的,

因此,当数据库中的数据发生变化时,就必须手工触发Lucene,让它随之更新检索文件中的内容,使之与数据库中的实际数据保持一致。这也就意味着dao中的每一个函数都要插入一段Lucene的代码,这样做有违OCP原则,这一层面应被提取到单独的逻辑层。此外model类别如何映射到全文检索引擎中,这也是一个问题,必须要手工处理这种映射关系,这样使用Lucene的代价就大大增加了。为了解决这些使用上的问题,Hibernate Search应运而生。

那么,Lucene、Hibernate Search及Hibernate三者之间是什么样的关系呢?请见下图:

@

如图所示,Hibernate+Hibernate Search位于全文检索数据目录及实际数据库中间。一方面,Hibernate处理与数据库相关的事宜,另一方面Hibernate Search会根据数据库中实际数据的情况,自动触发更新全文检索数据目录。此外Hibernate Search自动完成model层数据类对Lucene检索文件结构的映射。


安装Hibernate Search

如果需要在项目中使用Hibernate Search功能,请在Maven的pom.xml配置文件中添加下述dependency:

  1. <dependency>  
  2.     <groupId>org.hibernate</groupId>  
  3.     <artifactId>hibernate-search</artifactId>  
  4.     <version>5.2.0.GA</version>  
  5. </dependency>  
  1. <dependency>  
  2.     <groupId>org.hibernate</groupId>  
  3.     <artifactId>hibernate-search</artifactId>  
  4.     <version>5.2.0.GA</version>  
  5. </dependency>  


修改Hibernate.cfg.xml配置使用Hibernate Search

<span style="font-family:SimSun;font-size:14px;"><property name="hibernate.search.default.directory_provider">              org.hibernate.search.store.FSDirectoryProvider               </property>          <property name="hibernate.search.default.indexBase">              D:/temp/index                </property>          <mapping resource="com/rbh/examples/Guestbook.hbm.xml" />          <event type="post-update">              <listener class="org.hibernate.search.event.FullTextIndexEventListener" />          </event>          <event type="post-insert">              <listener class="org.hibernate.search.event.FullTextIndexEventListener" />          </event>          <event type="post-delete">              <listener class="org.hibernate.search.event.FullTextIndexEventListener" />          </event>          <event type="post-collection-recreate">              <listener class="org.hibernate.search.event.FullTextIndexCollectionEventListener" />          </event>          <event type="post-collection-remove">              <listener class="org.hibernate.search.event.FullTextIndexEventListener" />          </event>          <event type="post-collection-update">              <listener class="org.hibernate.search.event.FullTextIndexEventListener" />          </event> </span>


修改持久化类,使用注解配置全文索引
@Indexed  public class GuestDoor implements java.io.Serializable {   .............       @DocumentId  //表示这个对象的主键id       public Integer getId() {           return this.id;       }         @Field(store = Store.YES)       public String getName() {           return this.name;       }   ...............   }  

对持久化对象建立索引
Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.getTransaction().begin();   FullTextSession ftSession = org.hibernate.search.Search.getFullTextSession(session);   List<GuestDoor> guestDoors= session.createQuery("from GuestDoor").list();   for (GuestDoor guestDoor : guestDoors) {      ftSession.index(gb);   }   ftSession.getTransaction().commit();  

 搜索全文索引后的持久化对象
QueryParser parser = new QueryParser("title", new StandardAnalyzer());   org.apache.lucene.search.Query luceneQuery = null;   try {       luceneQuery = parser.parse("title:test"); // build Lucene query   } catch (ParseException e) {       e.printStackTrace();   }     Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();   session.getTransaction().begin();   FullTextSession ftSession = org.hibernate.search.Search.getFullTextSession(session);   org.hibernate.Query query = ftSession.createFullTextQuery(luceneQuery, Guestbook.class);   query.setMaxResults(20);   query.setFirstResult(0);   List<GuestDoor> guestDoors = query.list();   for (GuestDoor gd : guestDoors) {       printGuestbook(gd);   }     ftSession.getTransaction().commit();  





 总结

Hibernate Search主要有以下功能特点:

1,功能强大,配置简单 - 配置只需要修改persistence.xml(JPA),hibernate.cfg.xml(Hibernate)

2,支持Hibernate,以及EJB3 JPA标准应用

3,集成全文搜索引擎Lucene - Lucene是Apache项目组下的一个功能强大的全文搜索引擎项目

4,可以简单透明索引查询过的数据

5,支持复杂检索 - 支持Wild Card(诸如*, ?等通配符号),多关键字,模糊查询,排序等

6,支持Clustering

7,支持直接访问Lucene API

8,对Lucene索引,API的高效管理。




Hibernate Search运行的环境如下:

1、JDK或JRE 5.0以上
2、Hibernate-Search以及相应的依赖包
3、Hibernate Core 3.2.X
4、Hibernate Annotations 3.3.X




0 0
原创粉丝点击