Hibernate Search

简介: Hibernate Search是在apache Lucene的基础上建立的主要用于Hibernate的持久化模型的全文检索工具。像Lucene这样的检索引擎能够给我们的项目在进行检索的时候带来非常高的效率,但是它们在基本对象的检索时会有一些问题,比如不能实现检索内容跟实体的转换,Hibernate Search正是在这样的情况下发展起来的,基于对象的检索引擎,能够很方便的将检索出来的内容转换为具体的实体对象。

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)

 

目录
相关文章
|
Java 数据库连接 Apache
hibernate Search 学习研究 附件是maven工程
  Jboss 的 hibernate search 支持 hibernate 应该比较好。   所以想在项目 里面使用 hibernate search 进行 搜索。   分词使用的是 IKAnalyzer    网站是 :   http://code.google.com/p/ik-analyzer/   使用的 是 hibernate 3.6.8 + spring 
1368 0
|
Java 数据库连接 索引
hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)
首先安装 memecached 服务端:   之前写过的 文章,centos 安装memcached服务 :   http://toeo.iteye.com/blog/1240607   然后 在 前几天的 弄的  hibernate search 基础上,再添加 memcached 缓存。   因为 hibernate search 虽然 建立了索引。查询速度快了。
1644 0
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
471 0
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
391 1
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
447 1
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
649 0
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
368 1
|
SQL Java 关系型数据库
数据库访问:什么是Hibernate框架?
【4月更文挑战第15天】Hibernate是开源ORM框架,将Java对象与数据库表映射,简化对象-关系映射,提升开发效率和性能。它自动化处理数据操作,支持多种数据库,自动生成SQL,提供配置选项和高级特性,减少手动SQL编写,便于切换数据库。
344 2