不久前Hibernate推出了Hibernate Search 3.0 GA,由它的名字大家也可以大概猜到它的作用是对数据库中的数据进行检索的。它是hibernate对著名的全文检索系统Lucene的一个集成方案,作用在于对数据表中某些内容庞大的字段(如声明为text的字段)建立全文索引,这样通过hibernate search就可以对这些字段进行全文检索后获得相应的POJO,从而加快了对内容庞大字段进行模糊搜索的速度(sql语句中like匹配)。
Hibernate Search运行的环境如下:
1、JDK或JRE 5.0以上
2、Hibernate-Search以及相应的依赖包
3、Hibernate Core 3.2.X
4、Hibernate Annotations 3.3.X
一、配置
使用过Lucene的人都知道,Lucene是使用Directory这个概念来存储索引文件的,所以在Hibernate Search中提供了一个初始化、配置化的工厂类DirectoryProvider来生成相应的Directory。而在这里,我使用了FSDirectoryProvider这个工厂类,其中FS代表文件系统,意思是索引文件保存在文件系统中。因此,我们在hibernate.cfg.xml文件中加入了一下内容:
xml 代码
-
<property name="hibernate.search.default.directory_provider">
-
org.hibernate.search.store.FSDirectoryProvider
- </property>
- <property name="hibernate.search.default.indexBase">
-
E:/temp/index
- </property>
其中属性hibernate.search.default.indexBase代表索引文件默认的保存位置。
这些属性设置完成后,接下来就是使用Annotation对指定POJO的指定属性进行配置了。如下:
java 代码
-
@Indexed(index = "text")
- public class Text implements java.io.Serializable
-
{
-
@DocumentId
-
private Integer id;
-
-
private String fileName;
-
-
private String filePath;
-
-
@Field(name = "content", store = Store.NO, index = Index.TOKENIZED, analyzer = @Analyzer(impl = ChineseAnalyzer.class))
-
private String content;
-
-
......
-
}
其中@Indexed用于标示需要建立全文索引的实体类,它包含一个属性index用于标示这个全文索引的名字
@DocumentId用于标示实体类中的唯一的属性保存在索引文件中,是当进行全文检索时可以这个唯一的属性来区分索引中其他实体对象,一般使用实体类中的主键属性
@Field就是用来标示Lucene的Field字段,其中name属性用于标示Field的名称,store属性用于标示这个属性的内容是否需要保存在索引中,index属性标示该字段属性是否进行分词(Index.TOKENIZED),analyzer用于标示建立索引时所使用的分析器是什么类,这里使用Lucene自带的ChineseAnalyzer
二、建立索引
配置完成以上设置之后,Hibernate Search的配置工作算是大功告成了,剩下的就是如何在编码时使用到Hibernate Search。其实Hibernate Search的使用与我们平时Hibernate的使用基本一致,索引的建立工作是可以由Hibernate Search后台自动处理的,无需手工操作,其中的主要差别有
1、Configuration
由于本文中Hibernate Search配置是由Annotation来完成的,所以我们在初始化Configuration、SessionFactory、Session时应该这样写:
java 代码
-
factory = new AnnotationConfiguration().configure(file).buildSessionFactory();
使用AnnotationConfiguaration来代理平常使用的Configuration
2、Session
要使用Hibernate Search的功能就不能单纯使用平常的Session来开始事务,进行数据库操作,而是应该改用FullTextSession
java 代码
-
-
Session session = HibernateUtil.getSession();
-
-
FullTextSession fullTextSession = Search.createFullTextSession(session);
-
-
-
Transaction tx = fullTextSession.beginTransaction();
-
-
......
-
-
-
tx.commit();
-
-
fullTextSession.close();
这样,我们使用FullTextSession进行save,update,delete操作hibernate search将会自动根据配置在后台对相应的域建立全文索引了
三、检索
接下来就是说一下如何使用全文检索功能来检索实体对象了。
java 代码
-
Session session = HibernateUtil.getSession();
-
FullTextSession fullTextSession = Search.createFullTextSession(session);
-
-
Transaction tx = fullTextSession.beginTransaction();
-
-
QueryParser parser = new QueryParser("content", new ChineseAnalyzer());
-
-
Query query = fullTextSession.createFullTextQuery(parser.parse(word),
-
Text.class);
-
-
List result = query.list();
- for (int i = 0; result != null && i < result.size(); i++)
-
{
-
Text pojo = (Text) result.get(i);
-
System.out.println("文件名:" + pojo.getFileName());
-
System.out.println("文件路径:" + pojo.getFilePath());
-
System.out.println();
-
}
-
-
tx.commit();
-
fullTextSession.close();
首先是建立相应的QueryParser由他来对输入的关键字进行切分后产生Lucene下的Query实例,最后通过FullTextSession的createFullTextQuery方法生成hibernate下的Query实例,执行list方法即可获得查询的实例结果集合。
四、完
以上便是今天我对Hibernate Search的一个尝试,属于很基础很基础的入门,希望可以对大家能有一些启发跟帮助,随文附带我的源代码
定,下载运行一下,Annotations 以前还没有用过,还是大学生有学习热情啊。
分享到:
相关推荐
企业级应用和Web应用都需要具备类似于Google级别的搜索能力,以便提供更加高效、准确的信息检索服务。然而,构建这样的搜索系统通常非常复杂且耗时,需要开发者具备深厚的技术功底。 #### 三、Hibernate Search的...
Hibernate Search通过集成Apache Lucene库实现了这个功能。首先,你需要在实体类上添加注解`@Entity`和`@Indexed`,表明这个实体类需要被搜索引擎索引。接着,定义字段上的`@Field`注解,指定哪些字段应该被索引。...
它基于Apache Lucene库,可以对数据库中的字段进行索引,实现类似Google的搜索体验。 3. **版本号5.0.1.Final**:这表明这是Hibernate Search的稳定版本,Final表示经过充分测试和验证,适合生产环境使用。 4. **...
Hibernate Search广泛应用于电子商务、新闻门户、文档管理系统等领域,可以实现高效的全文搜索功能,提升用户体验。 总结,hibernate-search-3.2.1.Final-dist.zip这个压缩包中的内容,是开发者构建基于Hibernate...
这个特性使得应用程序能够提供类似于Google的搜索体验,极大地提升了用户体验。 二、主要功能 1. **全文索引**:Hibernate Search自动跟踪数据库中的变化,并更新相应的全文索引,确保数据的实时性。 2. **多字段...
1. **全文搜索**:Hibernate Search支持对持久化对象的属性进行全文搜索,提供了类似于Google的搜索体验。 2. **索引同步**:当数据库中的数据发生变化时,索引会自动更新,确保搜索结果与数据库内容保持一致。 3....
7. **HQL(Hibernate Query Language)**: Hibernate 自己的查询语言,类似于 SQL,但面向对象,用于查询实体对象。 8. **Criteria API**: 提供一种面向对象的查询方式,比HQL更灵活,可动态构建查询条件。 9. **...
而Hibernate Search则是Hibernate的一个扩展,它集成Lucene搜索引擎,允许开发者在Java应用中进行复杂的全文搜索,提供类似Google的搜索体验。 本书深入探讨了以下几个核心知识点: 1. **Hibernate Search基本概念...
5. **HQL(Hibernate Query Language)**: Hibernate提供了自己的查询语言HQL,类似于SQL,但面向对象。HQL可以用来执行复杂的查询,包括聚合函数、子查询等。 6. ** Criteria API**: 除了HQL,Hibernate还提供了...
4. **Query/Criteria API**: Hibernate提供了强大的查询API,包括HQL(Hibernate Query Language,类似于SQL)和Criteria API,使得开发者能以面向对象的方式来编写查询语句。 二、核心组件详解: 1. **Hibernate ...
4. **查询语言**:Hibernate Query Language (HQL) 是一种面向对象的查询语言,类似于SQL,但它是针对对象而非表格。此外,Criteria API和 CriteriaBuilder 提供了更高级的查询方式。 5. **缓存机制**:Hibernate...
- HQL(Hibernate Query Language):面向对象的查询语言,类似于SQL,但操作的是对象而不是表。 - Criteria API:提供了一种更面向对象的查询方式,可以动态构建查询条件。 6. **最佳实践** - 使用二级缓存提高...
5. **查询语言HQL和Criteria API**:介绍Hibernate查询语言(HQL),类似于SQL但面向对象,以及Criteria API,提供更动态的查询方式。 6. **缓存机制**:讨论Hibernate的缓存策略,包括一级缓存和二级缓存,以及...
6. **hibernate-search**:支持全文搜索功能,可以对数据库中的文本数据进行索引和检索,类似于Lucene库,但与Hibernate紧密集成。 在使用Hibernate时,开发者需要定义实体类,这些类代表数据库中的表,并使用注解...
`hibernate-search-4.4.0`子目录可能包含了Hibernate的全文搜索模块,这是Hibernate的一个附加组件,它利用Lucene或其他搜索引擎实现对数据库中的实体进行全文检索。这个模块允许开发者对实体进行索引,然后执行复杂...
2. **Hibernate Search**:这是一个基于Lucene的全文搜索引擎,可以对Hibernate实体进行全文索引和搜索。通过集成Hibernate Search,开发者可以实现复杂、高效的全文检索功能,而无需深入理解搜索引擎的底层细节。 ...
Hibernate查询语言(HQL)是一种面向对象的查询语言,类似于SQL,但以Java对象的形式表达。它可以方便地执行复杂的查询,包括关联查询、分组和排序等。 6. ** Criteria API** Hibernate还提供了Criteria API,这...
5. **查询语言**:`hibernate-search-orm.jar`可能包含了Hibernate的全文搜索功能,它利用了Lucene库来提供对数据库中的文本进行索引和搜索的能力。 6. **依赖库**:其他的JAR文件可能是Hibernate依赖的第三方库,...
4. **HQL(Hibernate Query Language)**:是Hibernate提供的面向对象的查询语言,类似于SQL,但更接近于Java语法,可以用来检索、修改、删除对象。HQL减轻了开发者学习和使用SQL的负担。 5. **Criteria API**:...
3. **Hibernate Search**:基于 Lucene 的全文搜索功能,支持在数据库中进行复杂的文本搜索。 ### 八、集成 Spring 在 Spring 中使用 Hibernate,可以通过 Spring 的 Transaction Management 和 DAO Support 提供...