Hibernate Search是在apache Lucene的基础上建立的主要用于Hibernate的持久化模型的全文检索工具。像Lucene这样的检索引擎能够给我们的项目在进行检索的时候带来非常高的效率,但是它们在基本对象的检索时会有一些问题,比如不能实现检索内容跟实体的转换,Hibernate Search正是在这样的情况下发展起来的,基于对象的检索引擎,能够很方便的将检索出来的内容转换为具体的实体对象。此外Hibernate Search能够根据需要进行同步或异步的索引更新。
下面是一些比较基本的用法(我用的是基于spring的)
先要在ApplicationContext里面的hibernate配置里面进行配置,下面是sessionFactory的配置:
如果单独使用的话也是要配置那些属性的:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan">
<list>
<value>com.tiantian.test.model</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQL5InnoDBDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- hibernate search -->
<prop key="hibernate.search.default.directory_provider">filesystem</prop>
<prop key="hibernate.search.default.indexBase">var/lucene/indexes</prop><!--索引的存放位置-->
</props>
</property>
</bean>
需要进行检索的实体类:
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.search.annotations.DateBridge;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Resolution;
@Entity
@Table(name = "t_Model4")
@Indexed//这个一定要加,表示该类将被Hibernate Search纳入检索范围
public class Model4 {
private int id;
private String name;
private String address;
private Date date = new Date();
@Id
@GeneratedValue
@DocumentId//对于GeneratedValue可以不用这个注解,表示文档的id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Field(index = Index.TOKENIZED)//需要索引的属性,index表示分词策略
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Field(index = Index.TOKENIZED)
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Field(index = Index.TOKENIZED)
//索引date时需要传入一个date对象
@DateBridge(resolution = Resolution.DAY)//时间属性中需要索引的具体属性,可以是年、月、日、小时等
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String toString() {
return " id = " + id + ", \r\n name = " + name + ", \r\n address = "
+ address + ", \r\n date = " + date;
}
下面是一段检索的示例代码:(匹配检索)
@SuppressWarnings("unchecked")
@Override//Pager是我自定义的一个分页工具类
public Pager<Model4> find(String key, int offset, int maxResults) {
// TODO Auto-generated method stub
//第一步,获得Hibernate的Session对象
Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
//第二步,通过Hibernate的Session获取FullTextSession对象
FullTextSession fullTextSession = Search.getFullTextSession(session);
//获取特定类的特定QueryBuilder对象
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Model4.class).get();
//得到search query
org.apache.lucene.search.Query query = queryBuilder.keyword().onField("name").andField("address").matching(key).createQuery();//key表示要用于检索的词
//这里使用FullTextQuery和org.hibernate.Query来分装org.apache.lucene.search.Query都是可以的,
//但FullTextQuery的功能比org.hibernate.Query的功能要强大一点,究竟什么时候要用org.hibernate.Query而不能用
//org.apache.lucene.search.Query这个我暂时还没有发现!
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, Model4.class);
Sort sort = new Sort(new SortField("id",SortField.INT));//后一个参数表示排序字段的类型
fullTextQuery.setSort(sort);//排序依据
fullTextQuery.setFirstResult(offset).setMaxResults(maxResults);//很显然的分页操作
int totalResults = fullTextQuery.getResultSize();//获取满足条件的总记录数
List<Model4> data = fullTextQuery.list();
Pager<Model4> pager = new Pager<Model4>();
pager.setData(data);
pager.setTotalResults(totalResults);
return pager;
}
范围检索的示例代码(主要用于日期或者数字型字段):
/**
* range,范围检索,主要用于数字和日期等
*/
@SuppressWarnings("unchecked")
@Override
public Pager<Model7> find(int offset, int maxResults) {
// TODO Auto-generated method stub
Session session = this.getHibernateTemplate().getSessionFactory()
.getCurrentSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Model7.class).get();
Query query = queryBuilder.range().onField("num").above(30)
.createQuery();//表示30以上
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(
query, Model7.class);
int totalResults = fullTextQuery.getResultSize();
List<Model7> data = fullTextQuery.setFirstResult(offset)
.setMaxResults(maxResults).list();
Pager<Model7> pager = new Pager<Model7>();
pager.setData(data);
pager.setTotalResults(totalResults);
return pager;
}
除什么之外的记录的示例代码:
@SuppressWarnings("unchecked")
@Override
/**
* except除了什么之外的所有的记录
*/
public Pager<Model7> findExcept(String key, int offset, int maxResults) {
// TODO Auto-generated method stub
Session session = this.getHibernateTemplate().getSessionFactory()
.getCurrentSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Model7.class).get();
// except方法用于指定需要排除的查询
Query query = queryBuilder
.all()
.except(queryBuilder.keyword().onField("address").matching(key)
.createQuery()).createQuery();
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(
query, Model7.class);
int totalResults = fullTextQuery.getResultSize();
List<Model7> data = fullTextQuery.setFirstResult(offset)
.setMaxResults(maxResults).list();
Pager<Model7> pager = new Pager<Model7>();
pager.setData(data);
pager.setTotalResults(totalResults);
return pager;
}
(必须有或必须没有的内容)的示例代码:
/**
* 哪些必须有,哪些必须没有,哪些可有可无
*/
public Pager<Model7> findShouldMust(String nameShould, String addressMust,
int offset, int maxResults) {
// TODO Auto-generated method stub
Session session = this.getHibernateTemplate().getSessionFactory()
.getCurrentSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Model7.class).get();
// should表示可有可无,must表示必须有,mustnot表示必须没有
Query query = queryBuilder
.bool()
.should(queryBuilder.keyword().onField("name")
.matching(nameShould).createQuery())
.must(queryBuilder.keyword().onField("address")
.matching(addressMust).createQuery()).createQuery();
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(
query, Model7.class);
int totalResults = fullTextQuery.getResultSize();
List<Model7> data = fullTextQuery.setFirstResult(offset)
.setMaxResults(maxResults).list();
Pager<Model7> pager = new Pager<Model7>();
pager.setData(data);
pager.setTotalResults(totalResults);
return pager;
}
关于Hibernate Search的更多操作可以查阅其官方文档 HTML (single page)
分享到:
相关推荐
Hibernate Search是Hibernate ORM框架的一个扩展,它允许开发者在Java应用中实现全文搜索功能。这个工具结合了ORM的强大和Lucene搜索引擎的高效,使得数据库中的数据可以被快速、精准地检索。本文将深入探讨如何创建...
Hibernate Search是一个强大的库,它为Hibernate框架提供了全文搜索的功能。全文搜索是一种强大的信息检索方式,可以让用户通过关键词快速定位到存储在大量数据中的相关内容。Hibernate Search库将全文搜索与...
这个“hibernateSearch+demo”项目提供了一个实战示例,帮助开发者理解并应用 Hibernate Search 的核心概念和功能。 在 Hibernate Search 中,主要涉及以下关键知识点: 1. **全文索引**:Hibernate Search 使用 ...
《Hibernate Search in Action》这本书深入探讨了Hibernate Search这一强大的全文搜索引擎集成框架,它将全文搜索功能无缝地融入到Java持久层框架Hibernate之中。通过利用Lucene库的强大功能,Hibernate Search为...
**Hibernate Search配置及简单应用** Hibernate Search是Hibernate框架的一个扩展,它允许我们在应用程序中实现全文检索功能,使得数据库中的数据可以被快速、高效地搜索。这个功能尤其在处理大量文本数据时非常...
3. **Hibernate Search**:作为Hibernate的一个扩展,Hibernate Search提供了基于Lucene的全文检索功能,使得在数据库中的数据可以被快速、精确地搜索。 **二、集成Hibernate Search** 1. **配置依赖**:首先,你...
《Hibernate Search in Action》是一本深入探讨Hibernate Search技术的专业书籍,配合源代码一同学习,能够帮助读者更好地理解和应用这项强大的全文检索和分析框架。Hibernate Search是Hibernate ORM的一个扩展,它...
使用hibernate search实现全文检索和文档管理功能: 1 全文检索 2 手动生成索引 3 文档上传(自动建立索引) 4 文档更新(自动建立索引) 5 文档删除 使用说明: 1 需要先恢复数据库 searchDB_2008sqlserver.bak 2 ...
本资源提供了基于Hibernate Search实现的全文搜索引擎的完整代码和配置文件,适用于处理中英文数据,具备拼音搜索、错误纠正和搜索建议等高级功能。 Hibernate Search是Hibernate ORM的一个扩展,它允许开发者在...
hibernate-search, Hibernate Search Hibernate 搜索版本:5.8.0. Final - 13-09-2017描述针对Java对象的全文搜索这个项目提供 Hibernate ORM和全文索引服务( 如 Apache Lucene和 Elasticsearch
Hibernate Search 4.4.0.Final API 帮助文档
Hibernate Search的作用是对数据库中的数据进行检索的。它是hibernate对著名的全文检索系统Lucene的一个集成方案,作用在于对数据表中某些内容庞大的字段(如声明为text的字段)建立全文索引,这样通过hibernate ...
压缩包包括项目完整代码,详细说明和项目结构图,效果图 项目实现了分页和高亮显示 MAVEN项目:HibernateSearchDemo IDE :MyEclipse jdk :1.6 数据库 :MySql ...hibernate search 版本 4.4.1.Final
《Hibernate Search in Action》这本书是关于Java开发中利用Hibernate Search框架进行全文检索的权威指南。Hibernate Search是一个在Hibernate ORM之上构建的搜索引擎,它允许开发者在Java应用中实现强大的、数据库...
《Hibernate Search 3.4.0.Final:深入探索企业级数据检索的利器》 Hibernate Search,作为Hibernate ORM框架的一个强大扩展,为Java开发者提供了一种在持久化数据上进行全文搜索的能力。这个3.4.0.Final版本是...
标题与描述:“Getting Started with Hibernate Search” 在深入探讨前,我们先来理解“Hibernate Search”这一概念。Hibernate Search是Hibernate框架的一个扩展,它为持久化的领域模型提供了全文搜索查询的能力,...