也许你的项目正在使用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;
- }
- }
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;
- }
//索引名称 @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>
<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();
- }
- }
- }
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();
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是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框架的一个扩展,它为持久化的领域模型提供了全文搜索查询的能力,...