`
jetway
  • 浏览: 483793 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Hibernate Search

 
阅读更多

也许你的项目正在使用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包添加到你的项目中。
     
      新建一个领域模型
       
     

Java代码 复制代码 收藏代码
  1.       public class Book {  
  2.     Integer bookId;  
  3.     String title;  
  4.     String author;  
  5.     String publishDate;  
  6.     String summarize;  
  7.     public Integer getBookId() {  
  8.         return bookId;  
  9.     }  
  10.     public void setBookId(Integer bookId) {  
  11.         this.bookId = bookId;  
  12.     }  
  13.     public String getTitle() {  
  14.         return title;  
  15.     }  
  16.     public void setTitle(String title) {  
  17.         this.title = title;  
  18.     }  
  19.     public String getAuthor() {  
  20.         return author;  
  21.     }  
  22.     public void setAuthor(String author) {  
  23.         this.author = author;  
  24.     }  
  25.     public String getPublishDate() {  
  26.         return publishDate;  
  27.     }  
  28.     public void setPublishDate(String publishDate) {  
  29.         this.publishDate = publishDate;  
  30.     }  
  31.     public String getSummarize() {  
  32.         return summarize;  
  33.     }  
  34.     public void setSummarize(String summarize) {  
  35.         this.summarize = summarize;  
  36.     }  
  37.       
  38. }  
  39.         
      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注解
     

Java代码 复制代码 收藏代码
  1.      //索引名称  
  2.      @Indexed(index = "books")  
  3.      //分词器  
  4.      @Analyzer(impl = MMSegAnalyzer.class)  
  5.      public class Book {  
  6. Integer bookId;  
  7. String title;  
  8. String author;  
  9. String publishDate;  
  10. String summarize;  
  11.          
  12.       //以对象的唯一标志做为索引中文档的唯一标志  
  13.        @DocumentId  
  14. public Integer getBookId() {  
  15.     return bookId;  
  16. }  
  17. public void setBookId(Integer bookId) {  
  18.     this.bookId = bookId;  
  19. }  
  20.        //索引title字段,并设置了权重  
  21.        @Field(name = "title", index = Index.TOKENIZED, store = Store.YES, boost=@Boost(2f))  
  22. @Boost(1.5f)  
  23. public String getTitle() {  
  24.     return title;  
  25. }  
  26. public void setTitle(String title) {  
  27.     this.title = title;  
  28. }  
  29. public String getAuthor() {  
  30.     return author;  
  31. }  
  32. public void setAuthor(String author) {  
  33.     this.author = author;  
  34. }  
  35. public String getPublishDate() {  
  36.     return publishDate;  
  37. }  
  38. public void setPublishDate(String publishDate) {  
  39.     this.publishDate = publishDate;  
  40. }  
  41.         
  42.       //索引摘要字段,并设置权重  
  43.       @Field(name = "summarize", index = Index.TOKENIZED, store = Store.YES, boost=@Boost(1.2f))  
  44. public String getSummarize() {  
  45.     return summarize;  
  46. }  
  47. public void setSummarize(String summarize) {  
  48.     this.summarize = summarize;  
  49. }  
      //索引名称
      @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节中加入

Java代码 复制代码 收藏代码
  1. <property name="hibernate.search.default.directory_provider">  
  2.     org.hibernate.search.store.FSDirectoryProvider  
  3.      </property>  
  4.      <property name="hibernate.search.default.indexBase">  
  5.      D:\data\indexs  
  6.      </property>  
<property name="hibernate.search.default.directory_provider">
	org.hibernate.search.store.FSDirectoryProvider
     </property>
     <property name="hibernate.search.default.indexBase">
	 D:\data\indexs
     </property>

 

     到这里,配置和修改就已经完成了。当对象被插入,修改或删除的时候,将会出发索引的修改。
    
      如果你想对数据库中已有的数据建立索引可以

   

Java代码 复制代码 收藏代码
  1.      public class IndexBuilder {  
  2.     static Logger log = Logger.getLogger("IndexBuilder");  
  3.   
  4.     public static void main(String[] args) {  
  5.         Session session = null;  
  6.         try {  
  7.                         //配置文件  
  8.             ApplicationContext cxt = new FileSystemXmlApplicationContext(  
  9.                     "..\\WEB-INF\\applicationContext.xml");  
  10.             SessionFactory sessionFactory = (SessionFactory) cxt  
  11.                     .getBean("sessionFactory");  
  12.             session = sessionFactory.openSession();  
  13.             FullTextSession fullTextSession = Search  
  14.                     .createFullTextSession(session);  
  15.             Query query = session.createQuery("from Book")  
  16.                     .setMaxResults(1000);  
  17.             SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  18.             int j = 0;  
  19.             int sum = 0;  
  20.             log.info("start Indexing at "+df.format(Calendar.getInstance().getTimeInMillis()));  
  21.             while (true) {  
  22.                 session.getTransaction().begin();  
  23.                 List<PvmsMaterialProgram> list = query.setFirstResult(j).list();  
  24.                 for (PvmsMaterialProgram program : list) {  
  25.                     fullTextSession.index(program);  
  26.                 }  
  27.                 session.getTransaction().commit();  
  28.                 j += 1000;  
  29.                 if (list.size() < 1000)  
  30.                     break;  
  31.                 sum += list.size();  
  32.                 log.info("finish " + sum + " records");  
  33.             }  
  34.             log.info("end at "+df.format(Calendar.getInstance().getTimeInMillis()));  
  35.         } catch (Exception e) {  
  36.             e.printStackTrace();  
  37.         } finally {  
  38.             if (session != null)  
  39.                 session.close();  
  40.         }  
  41.     }  
  42. }  
  43.         
     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接口(参考官方的手册)。

      

Java代码 复制代码 收藏代码
  1.        session = sessionFactory.getCurrentSession();  
  2. tx = session.beginTransaction();  
  3.        String keyword = "足球"  
  4. FullTextSession fullTextSession = Search.createFullTextSession(session);  
  5.        //这里同时对title和摘要字段进行检索  
  6.        String[] fields = { "title""summarize" };  
  7. String[] values = { keyword, keyword};  
  8. MultiFieldQueryParser parser = new MultiFieldQueryParser(  
  9.     org.apache.lucene.util.Version.LUCENE_30, fields,new MMSegAnalyzer());  
  10.     org.apache.lucene.search.Query luceneQuery = parser.parse(  
  11.           org.apache.lucene.util.Version.LUCENE_30, values, fields,new MMSegAnalyzer());  
  12.               //按发布时间排倒序  
  13.         org.apache.lucene.search.Sort sort = new Sort(new SortField(  
  14.                 "publishDate", SortField.LONG, true));  
  15.   
  16. FullTextQuery hibQuery = fullTextSession.createFullTextQuery(luceneQuery, Book.class);  
  17.        //  
  18. hibQuery.setSort(sort);  
  19.       //分页设置  
  20. hibQuery.setFirstResult(start);  
  21. hibQuery.setMaxResults(limit);  
  22. tx.commit();  
  23. // log.info("query list = "+hibQuery.list());  
  24. List books = hibQuery.list();       
  25.         
        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字段检索关键词"足球",并采取分页查询的策略。

       重建索引也非常简单

       

Java代码 复制代码 收藏代码
  1.       FullTextSession fullTextSession = Search              .getFullTextSession(sessionFactory.getCurrentSession());  
  2.        //异步  
  3. fullTextSession.createIndexer().start();  
  4.         //同步  
  5.        //fullTextSession.createIndexer().startAndwait();  
  6.       
分享到:
评论

相关推荐

    hibernate search全文索引的创建及查询

    Hibernate Search是Hibernate ORM框架的一个扩展,它允许开发者在Java应用中实现全文搜索功能。这个工具结合了ORM的强大和Lucene搜索引擎的高效,使得数据库中的数据可以被快速、精准地检索。本文将深入探讨如何创建...

    Hibernate Search In Action

    Hibernate Search是一个强大的库,它为Hibernate框架提供了全文搜索的功能。全文搜索是一种强大的信息检索方式,可以让用户通过关键词快速定位到存储在大量数据中的相关内容。Hibernate Search库将全文搜索与...

    hibernateSearch+demo

    这个“hibernateSearch+demo”项目提供了一个实战示例,帮助开发者理解并应用 Hibernate Search 的核心概念和功能。 在 Hibernate Search 中,主要涉及以下关键知识点: 1. **全文索引**:Hibernate Search 使用 ...

    hibernate Search in action

    《Hibernate Search in Action》这本书深入探讨了Hibernate Search这一强大的全文搜索引擎集成框架,它将全文搜索功能无缝地融入到Java持久层框架Hibernate之中。通过利用Lucene库的强大功能,Hibernate Search为...

    Hibernate Search配置及简单应用

    **Hibernate Search配置及简单应用** Hibernate Search是Hibernate框架的一个扩展,它允许我们在应用程序中实现全文检索功能,使得数据库中的数据可以被快速、高效地搜索。这个功能尤其在处理大量文本数据时非常...

    基于Spring的Hibernate Search全文检索功能示例

    3. **Hibernate Search**:作为Hibernate的一个扩展,Hibernate Search提供了基于Lucene的全文检索功能,使得在数据库中的数据可以被快速、精确地搜索。 **二、集成Hibernate Search** 1. **配置依赖**:首先,你...

    Hibernate Search in action (pdf && code)

    《Hibernate Search in Action》是一本深入探讨Hibernate Search技术的专业书籍,配合源代码一同学习,能够帮助读者更好地理解和应用这项强大的全文检索和分析框架。Hibernate Search是Hibernate ORM的一个扩展,它...

    使用hibernate search实现全文检索和文档管理的例子

    使用hibernate search实现全文检索和文档管理功能: 1 全文检索 2 手动生成索引 3 文档上传(自动建立索引) 4 文档更新(自动建立索引) 5 文档删除 使用说明: 1 需要先恢复数据库 searchDB_2008sqlserver.bak 2 ...

    基于hibernate search的全文搜索引擎实现完整代码和配置文件,支持中英文

    本资源提供了基于Hibernate Search实现的全文搜索引擎的完整代码和配置文件,适用于处理中英文数据,具备拼音搜索、错误纠正和搜索建议等高级功能。 Hibernate Search是Hibernate ORM的一个扩展,它允许开发者在...

    hibernate-search, Hibernate Search.zip

    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 4.4.0.Final API 帮助文档

    Hibernate搜索框架HibernateSearch.zip

    Hibernate Search的作用是对数据库中的数据进行检索的。它是hibernate对著名的全文检索系统Lucene的一个集成方案,作用在于对数据表中某些内容庞大的字段(如声明为text的字段)建立全文索引,这样通过hibernate ...

    HibernateSearch--maven集成了SSH

    压缩包包括项目完整代码,详细说明和项目结构图,效果图 项目实现了分页和高亮显示 MAVEN项目:HibernateSearchDemo IDE :MyEclipse jdk :1.6 数据库 :MySql ...hibernate search 版本 4.4.1.Final

    Hibernate Search in Action

    《Hibernate Search in Action》这本书是关于Java开发中利用Hibernate Search框架进行全文检索的权威指南。Hibernate Search是一个在Hibernate ORM之上构建的搜索引擎,它允许开发者在Java应用中实现强大的、数据库...

    hibernate search-3.4.0.Final-dist

    《Hibernate Search 3.4.0.Final:深入探索企业级数据检索的利器》 Hibernate Search,作为Hibernate ORM框架的一个强大扩展,为Java开发者提供了一种在持久化数据上进行全文搜索的能力。这个3.4.0.Final版本是...

    Getting Started with Hibernate search

    标题与描述:“Getting Started with Hibernate Search” 在深入探讨前,我们先来理解“Hibernate Search”这一概念。Hibernate Search是Hibernate框架的一个扩展,它为持久化的领域模型提供了全文搜索查询的能力,...

Global site tag (gtag.js) - Google Analytics