也许你的项目正在使用Spring+Hibernate,而你正好需要建立全文检索。Hibernate search可以无缝得整合Hibernate和Lucene,帮助你快速实现功能强大的全文检索。
Hibernate Search通过整合Hibernate core和Lucene建立持久化对象的索引。功能强大而配置简单。下载请到
官方网站。
Hibernate Search运行的环境如下:
1、JDK或JRE 5.0以上
2、Hibernate-Search以及相应的依赖包
3、Hibernate Core 3.2.X
4、Hibernate Annotations 3.3.X
首先将下载到的JAR包添加到你的项目中。
新建一个领域模型
public class Book {
Integer bookId;
String title;
String author;
String publishDate;
String summarize;
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishDate() {
return publishDate;
}
public void setPublishDate(String publishDate) {
this.publishDate = publishDate;
}
public String getSummarize() {
return summarize;
}
public void setSummarize(String summarize) {
this.summarize = summarize;
}
}
接下来在类中加入Hibernate search注解
//索引名称
@Indexed(index = "books")
//分词器
@Analyzer(impl = MMSegAnalyzer.class)
public class Book {
Integer bookId;
String title;
String author;
String publishDate;
String summarize;
//以对象的唯一标志做为索引中文档的唯一标志
@DocumentId
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
//索引title字段,并设置了权重
@Field(name = "title", index = Index.TOKENIZED, store = Store.YES, boost=@Boost(2f))
@Boost(1.5f)
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishDate() {
return publishDate;
}
public void setPublishDate(String publishDate) {
this.publishDate = publishDate;
}
//索引摘要字段,并设置权重
@Field(name = "summarize", index = Index.TOKENIZED, store = Store.YES, boost=@Boost(1.2f))
public String getSummarize() {
return summarize;
}
public void setSummarize(String summarize) {
this.summarize = summarize;
}
}
本文没有使用注解来完成类和数据的映射,而是使用book.hbm.xml的映射文件,当然你不用对映射文件做任何改动。如果你想使用注解,直接在类里中加入注解即可。
接下来需要修改hibernate.cfg.xml。在sessionFactory节中加入
<property name="hibernate.search.default.directory_provider">
org.hibernate.search.store.FSDirectoryProvider
</property>
<property name="hibernate.search.default.indexBase">
D:\data\indexs
</property>
到这里,配置和修改就已经完成了。当对象被插入,修改或删除的时候,将会出发索引的修改。
如果你想对数据库中已有的数据建立索引可以
public class IndexBuilder {
static Logger log = Logger.getLogger("IndexBuilder");
public static void main(String[] args) {
Session session = null;
try {
//配置文件
ApplicationContext cxt = new FileSystemXmlApplicationContext(
"..\\WEB-INF\\applicationContext.xml");
SessionFactory sessionFactory = (SessionFactory) cxt
.getBean("sessionFactory");
session = sessionFactory.openSession();
FullTextSession fullTextSession = Search
.createFullTextSession(session);
Query query = session.createQuery("from Book")
.setMaxResults(1000);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
int j = 0;
int sum = 0;
log.info("start Indexing at "+df.format(Calendar.getInstance().getTimeInMillis()));
while (true) {
session.getTransaction().begin();
List<PvmsMaterialProgram> list = query.setFirstResult(j).list();
for (PvmsMaterialProgram program : list) {
fullTextSession.index(program);
}
session.getTransaction().commit();
j += 1000;
if (list.size() < 1000)
break;
sum += list.size();
log.info("finish " + sum + " records");
}
log.info("end at "+df.format(Calendar.getInstance().getTimeInMillis()));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null)
session.close();
}
}
}
这里每一千条会提交一次。如果出现内存溢出,可以把虚拟机的内存调大一些。
索引构建好了,就可以开始使用查询功能了。Hibernate search支持复杂检索 - 支持Wild Card(诸如*, ?等通配符号),多关键字,模糊查询,排序等。可以使用封装好的接口也可以调用底层的lucene接口(参考官方的手册)。
session = sessionFactory.getCurrentSession();
tx = session.beginTransaction();
String keyword = "足球"
FullTextSession fullTextSession = Search.createFullTextSession(session);
//这里同时对title和摘要字段进行检索
String[] fields = { "title", "summarize" };
String[] values = { keyword, keyword};
MultiFieldQueryParser parser = new MultiFieldQueryParser(
org.apache.lucene.util.Version.LUCENE_30, fields,new MMSegAnalyzer());
org.apache.lucene.search.Query luceneQuery = parser.parse(
org.apache.lucene.util.Version.LUCENE_30, values, fields,new MMSegAnalyzer());
//按发布时间排倒序
org.apache.lucene.search.Sort sort = new Sort(new SortField(
"publishDate", SortField.LONG, true));
FullTextQuery hibQuery = fullTextSession.createFullTextQuery(luceneQuery, Book.class);
//
hibQuery.setSort(sort);
//分页设置
hibQuery.setFirstResult(start);
hibQuery.setMaxResults(limit);
tx.commit();
// log.info("query list = "+hibQuery.list());
List books = hibQuery.list();
这里对title和summarize字段检索关键词"足球",并采取分页查询的策略。
重建索引也非常简单
FullTextSession fullTextSession = Search .getFullTextSession(sessionFactory.getCurrentSession());
//异步
fullTextSession.createIndexer().start();
//同步
//fullTextSession.createIndexer().startAndwait();
分享到:
相关推荐
《Hibernate Search in Action》这本书深入探讨了Hibernate Search这一强大的全文搜索引擎集成框架,它将全文搜索功能无缝地融入到Java持久层框架Hibernate之中。通过利用Lucene库的强大功能,Hibernate Search为...
**Hibernate Search配置及简单应用** Hibernate Search是Hibernate框架的一个扩展,它允许我们在应用程序中实现全文检索功能,使得数据库中的数据可以被快速、高效地搜索。这个功能尤其在处理大量文本数据时非常...
通过阅读《Hibernate Search in Action》并实践配套代码,开发者可以掌握如何在Java应用中构建高效的全文搜索引擎,提升用户体验,实现更智能的数据检索功能。这不仅对于企业级应用的开发具有重要意义,也是个人技能...
Hibernate Search 是一个强大的全文搜索引擎框架,它将Apache Lucene库集成到Hibernate ORM中,使得在Java应用程序中实现复杂的全文检索和分析功能变得简单。这个"hibernate-search-5.5.4 api docset for Dash"是...
《Hibernate Search 4.3.0:全面解析与实践指南》 Hibernate Search是Java领域中一个强大的全文搜索引擎,它将Apache Lucene的功能与Hibernate ORM框架相结合,为Java应用程序提供了便捷的、高性能的全文检索功能。...
**hibernate search源码详解** Hibernate Search是Hibernate ORM框架的一个强大扩展,它将全文搜索引擎的功能集成到了Java持久层,使得开发者可以方便地在数据库中进行复杂的文本搜索。本篇文章将深入探讨Hibernate...
### Hibernate Search in Action:关键技术与应用实践 #### 一、企业级搜索技术概览 《Hibernate Search in Action》是一本面向Java开发者的专业书籍,它深入介绍了如何利用Hibernate Search实现高性能的企业级...
### 使用Hibernate Search入门详解 #### 引言 Hibernate Search作为Hibernate Core的...无论是初学者还是有经验的开发者,都可以通过学习和实践,充分发挥Hibernate Search的优势,提升数据检索的效率和用户体验。
综上所述,基于Spring的Hibernate Search全文检索功能示例涵盖了从集成、配置、索引构建到查询和优化等多个环节,是学习和实践中不可多得的参考资料。通过深入理解和实践,开发者可以为自己的Java应用带来高效、精准...
《Hibernate Search 4.2.0:全文搜索与对象关系映射的完美结合》 Hibernate Search是Hibernate ORM框架的一个扩展,它将强大的全文搜索引擎Lucene集成到Java应用程序中,允许开发者在数据库对象上进行复杂的全文...
《Hibernate Search In Action》这本书是关于Java开发中Hibernate Search框架的深入指南,它涵盖了这个强大的全文搜索引擎集成工具的各个方面。Hibernate Search允许开发者在Java应用程序中实现高效、灵活的全文搜索...
Apache Shiro + SpringMVC + Hibernate Search + Hibernate + Bootstrap企业信息管理系统基础框架搭建整合实例代码教程,这是一个典型的Java Web开发中的技术栈组合,用于构建高效、安全的企业级信息系统。...
标题中的“hibernate-search-orm-5.0.0.Alpha1.zip”指的是Hibernate Search ORM的一个早期版本,它是Hibernate框架的一个扩展,提供了在数据库中进行全文搜索和索引的功能。Hibernate是一个广泛使用的Java对象关系...
阅读《Hibernate Search Manual》(hibernate_search_manual.pdf)将帮助你更深入地理解这些概念,并提供详细的API参考和实践指导。通过这份指南,你将能够充分利用 Hibernate Search 的功能,为你的Java应用程序...
《深入理解Hibernate Search 4.1.0.Final:企业级全文检索的基石》 Hibernate Search是Hibernate ORM框架的一个扩展,它将强大的全文搜索引擎Lucene集成到Java应用程序中,为数据库对象提供了高级搜索功能。本篇...
《Hibernate Search 4.3.0.Final:企业级全文搜索引擎集成详解》 Hibernate Search是Hibernate ORM的一个扩展,它提供了一种在Java应用中实现全文搜索功能的方式,使得开发者能够轻松地在数据库中的数据上执行复杂...
8. **案例研究**:通过实际项目案例展示了Hibernate Search在电子商务、内容管理系统等领域的应用,提供了具体的实现细节和最佳实践。 9. **高级主题**:涵盖了如倒排索引原理、自定义分析器开发、以及与其他技术如...
《深入理解Hibernate Search 4.5.2.Final:企业级全文检索的利器》 Hibernate Search是Hibernate ORM框架的一个扩展,它将强大的全文搜索引擎Lucene集成到Java应用程序中,为数据库中的数据提供高效的全文检索能力...
《深入理解Hibernate4.x及其核心组件》 Hibernate4.x作为Java领域中著名的对象关系映射(ORM)框架,...而深入学习和实践,如利用Hibernate Search实现全文检索,将使开发者在处理大数据量和复杂查询时更加游刃有余。