1、开发环境:spring2.5、hibernate3.3.1GA、hibernateSearch3.1.0GA;
2、开发是基于maven上开发的,首先新建一个web工程,添加maven支持,在pom.xml中添加一下几个依赖包:
<dependencies>
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>javaee-api</artifactId>
<version>5.0-1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search</artifactId>
<version>3.1.0.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
</dependency>
<!-- hibernate framework end -->
<!-- lucene start -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
其他就是hibernate+spring的配置了;
注意一点的就是在配置文件hibernate的属性后面加上索引的监听和索引存放的位置,如:
<!-- Spring管理Hibernate的Mapping对象 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
<prop key="hibernate.hbm2ddl.auto">
${hibernate.hbm2ddl.auto}
</prop>
<prop key="hibernate.show_sql">
${hibernate.show_sql}
</prop>
<prop key="hibernate.use_sql_comments">
${hibernate.use_sql_comments}
</prop>
<prop key="hibernate.use_outer_join">
${hibernate.use_outer_join}
</prop>
<prop key="hibernate.current_session_context_class">
${hibernate.current.session.context.class}
</prop>
<prop key="connection.autoReconnect">
${connection.autoReconnect}
</prop>
<prop key="connection.autoReconnectForPools">
${connection.autoReconnectForPools}
</prop>
<prop key="connection.is-connection-validation-required">
${connection.is-connection-validation-required}
</prop>
<!-- 索引配置 -->
<prop key="hibernate.search.default.directory_provider">
org.hibernate.search.store.FSDirectoryProvider
</prop>
<prop key="hibernate.search.default.indexBase">
d:/JAVA/hibernateIndex
</prop>
</props>
</property>
<!-- 索引配置-->
<property name="eventListeners">
<map>
<entry key="post-update">
<bean class="org.hibernate.search.event.FullTextIndexEventListener" />
</entry>
<entry key="post-insert">
<bean class="org.hibernate.search.event.FullTextIndexEventListener" />
</entry>
<entry key="post-delete">
<bean class="org.hibernate.search.event.FullTextIndexEventListener" />
</entry>
</map>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>${hibernate.mappingDirectoryLocations}</value>
</list>
</property>
</bean>
这时启动如果报slf4j错误,可能是你的slf4j包冲突,需要把你lib里相关的jar包删了,在maven支持中还剩下slf4j-api-1.4.2.jar,需要导入slf4j-logging-1.4.2.jar包,如果导入更高版可能会报错,这个包在百度搜slf4j就能进入它的官网,很容易找到;
这个时候启动如果不报错,那成功一半了;接下来就是配置实体类了,比如一个商城系统要对订单建索引,实体类如(给出关键部分代码):
@Entity
@Indexed(index="shopOrders")
public class ShopOrders implements java.io.Serializable {
// Fields
@DocumentId
private String id;
private Integer uid;
@Field(index=Index.TOKENIZED,store=Store.YES)
private String username;
@Field(index=Index.UN_TOKENIZED,store=Store.YES)
private Integer isDelete;
这个时候启动你会发现你指定的路径下已经有了一个shopOrders文件夹,如果这个时候去搜索是搜索不到的,还没有初始化数据;
以下是数据初始化和查询的代码:
import java.util.Date;
import java.util.List;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.hibernate.CacheMode;
import org.hibernate.FlushMode;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.china.fung.hibernate.pojo.shop.ShopOrders;
public class Dao extends HibernateDaoSupport {
private static SessionFactory sessionFactory;
private static Session session = null;
private static LocalSessionFactoryBean factoryBean = null;
public void getMySession() throws Exception {
sessionFactory = this.getHibernateTemplate().getSessionFactory();
session = sessionFactory.openSession();
}
public List search(String keyword) throws Exception {
this.getMySession();
BooleanQuery.setMaxClauseCount(100000);
BooleanQuery booleanQuery = new BooleanQuery();
StandardAnalyzer analyzer=new StandardAnalyzer();
// 基本关键词搜索
String[] searchFields = new String[] { "username" };//成员变量
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
searchFields,analyzer);
queryParser.setDefaultOperator(QueryParser.Operator.AND);
Query query = queryParser.parse(keyword);
booleanQuery.add(query,BooleanClause.Occur.MUST);
QueryParser parse=new QueryParser("isDelete",analyzer);
Query query1=parse.parse("0");
parse.setDefaultOperator(QueryParser.Operator.AND);
booleanQuery.add(query1,BooleanClause.Occur.MUST);
FullTextSession fullSession = Search.getFullTextSession(session);
FullTextQuery fullQuery = fullSession.createFullTextQuery(booleanQuery,
ShopOrders.class);
int size = fullQuery.getResultSize();
System.out.println("size:" + size);
return fullQuery.list();
}
public void createIndexByHibernateSearch() throws Exception{
this.getMySession();
long startTime = new Date().getTime();
int BATCH_SIZE = 1000;
FullTextSession s = Search.getFullTextSession(session);
// Transaction tr = s.beginTransaction();
s.setFlushMode(FlushMode.MANUAL);
s.setCacheMode(CacheMode.IGNORE);
ScrollableResults results = s.createQuery("from ShopOrders").setFetchSize(BATCH_SIZE).scroll(ScrollMode.FORWARD_ONLY);
int index = 0;
while (results.next()) {
index++;
s.index(results.get(0)); // index each element
if (index % BATCH_SIZE == 0) {
// s.flushToIndexes(); //apply changes to indexes
s.clear(); // clear since the queue is processed
}
}
s.clear();
long endTime = new Date().getTime();
logger.warn("建立Product索引 , 这花费了" + (endTime - startTime) + " 毫秒来把文档增加到索引里面去!");
// tr.commit();
}
}
好了,到这基本就完事了,只需要在service里调用就行了,别忘了,先调用createIndexByHibernateSearch方法初始化(一次就行),再调用search方法搜索;
分享到:
相关推荐
本示例将详细介绍如何在基于Spring的应用中集成Hibernate Search。 **一、Spring与Hibernate Search简介** 1. **Spring框架**:Spring是一个开源的Java企业级应用框架,提供依赖注入、AOP(面向切面编程)、MVC...
《Hibernate Search in Action》是一本深入探讨Hibernate Search技术的专业书籍,配合源代码一同学习,能够帮助读者更好地理解和应用这项强大的全文检索和分析框架。Hibernate Search是Hibernate ORM的一个扩展,它...
总的来说,Hibernate Search的源码是一个深入了解ORM与搜索引擎集成的宝贵资源,对于提升Java全栈开发能力,特别是数据检索和分析领域,具有很高的学习价值。通过研究源码,开发者不仅可以解决实际问题,还能借鉴其...
2. **Hibernate Search**:作为Hibernate的扩展,Hibernate Search允许开发人员在数据库中实现全文本搜索。它基于Apache Lucene库,可以对数据库中的字段进行索引,实现类似Google的搜索体验。 3. **版本号5.0.1....
7. **文档与示例**:此版本提供的说明文档详尽地介绍了如何配置、使用和调试Hibernate Search,同时还包含了一些实例代码,帮助开发者快速上手。 综上所述,Hibernate Search 5.5.5.Final为Java开发者提供了一套...
《深入理解Hibernate Search 5.3.0 Beta2:数据库全文检索利器》 Hibernate Search是Hibernate框架的一个扩展,它提供了一种在Java应用中进行全文检索的解决方案。这个名为"hibernate-search-5.3.0.Beta2-dist"的...
1. **无缝集成**:Hibernate Search与Hibernate ORM无缝结合,使得数据库对象可以直接映射到Lucene索引,简化了开发流程。 2. **索引自动更新**:当数据库中的数据发生变化时,Hibernate Search会自动更新对应的...
总结来说,Hibernate Search ORM 4.4.2.Final是Java开发中实现全文检索的强大工具,而AtomicMapOperations则提供了并发映射的非阻塞原子操作,两者结合可以构建出高性能、高并发的搜索应用。对于任何处理大量数据和...
《Hibernate Search 3.4.0.Final:深入理解与应用》 Hibernate Search是Hibernate框架的一个强大扩展,它为Java应用程序提供了全文检索功能。在3.4.0.Final版本中,这一特性得到了进一步的优化和完善,使得开发者...
3. **数据存储**:使用Hibernate ORM进行数据库操作,同时通过Hibernate Search建立全文索引,提高检索效率。 4. **全文检索**:利用Lucene提供的功能实现高效的全文检索,这里使用了Lucene 3.1版本。 5. **分词处理...
这个压缩包"hibernate-search-4.5.2.Final-dist.tar.gz"包含了Hibernate Search 4.5.2.Final版本的所有组件和资源,是开发人员进行企业级搜索解决方案构建的重要工具。 一、Hibernate Search概述 Hibernate Search...
总之,Hibernate Search 4.5.2.Final是Java开发人员实现高效全文检索的强大工具,其与Hibernate ORM的无缝集成使得开发者能专注于业务逻辑,而无需过多关注底层搜索引擎的实现。通过理解和掌握这些知识点,你将能够...
3. **多语言支持**:Hibernate Search支持多种语言的分词和分析,如中文、英文等,通过配置不同的Analyzer,可以实现跨语言的搜索功能。 4. **查询表达式**:使用Lucene的QueryParser或者更高级的QueryBuilder,...
标题 "整合compass2.0 spring hibernate示例源程序" 提供了我们即将探讨的核心内容,即一个结合了Compass 2.0、Spring和Hibernate的集成示例。这个项目旨在展示如何在Java应用程序中有效地利用这三个强大的开源框架...
【Hibernate3详解】 Hibernate3 是一个轻量级的对象关系映射(ORM...总的来说,Hibernate3为Java开发人员提供了强大且灵活的数据库持久化解决方案,通过学习和掌握Hibernate,可以极大地提高开发效率,降低维护成本。