`
isoloist
  • 浏览: 62921 次
  • 性别: 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包添加到你的项目中。
     
      新建一个领域模型
       
     
      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();
        

      
          
   
    
    
分享到:
评论
2 楼 hellokitty_neo 2014-07-09  
对数据库已有数据建立索引 IndexBuilder如何执行啊?
1 楼 guoqiangi1 2012-08-09  
嗯,好!帮助小弟学习一下了。

相关推荐

    hibernate Search in action

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

    Hibernate Search配置及简单应用

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

    Hibernate Search in action (pdf && code)

    通过阅读《Hibernate Search in Action》并实践配套代码,开发者可以掌握如何在Java应用中构建高效的全文搜索引擎,提升用户体验,实现更智能的数据检索功能。这不仅对于企业级应用的开发具有重要意义,也是个人技能...

    hibernate-search-5.5.4 api docset for Dash

    Hibernate Search 是一个强大的全文搜索引擎框架,它将Apache Lucene库集成到Hibernate ORM中,使得在Java应用程序中实现复杂的全文检索和分析功能变得简单。这个"hibernate-search-5.5.4 api docset for Dash"是...

    hibernate-search-4.3.0.zip

    《Hibernate Search 4.3.0:全面解析与实践指南》 Hibernate Search是Java领域中一个强大的全文搜索引擎,它将Apache Lucene的功能与Hibernate ORM框架相结合,为Java应用程序提供了便捷的、高性能的全文检索功能。...

    hibernate search源码

    **hibernate search源码详解** Hibernate Search是Hibernate ORM框架的一个强大扩展,它将全文搜索引擎的功能集成到了Java持久层,使得开发者可以方便地在数据库中进行复杂的文本搜索。本篇文章将深入探讨Hibernate...

    Hibernate Search in Action

    ### Hibernate Search in Action:关键技术与应用实践 #### 一、企业级搜索技术概览 《Hibernate Search in Action》是一本面向Java开发者的专业书籍,它深入介绍了如何利用Hibernate Search实现高性能的企业级...

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

    综上所述,基于Spring的Hibernate Search全文检索功能示例涵盖了从集成、配置、索引构建到查询和优化等多个环节,是学习和实践中不可多得的参考资料。通过深入理解和实践,开发者可以为自己的Java应用带来高效、精准...

    hibernate-search-4.2.0.jar及说明pdf

    《Hibernate Search 4.2.0:全文搜索与对象关系映射的完美结合》 Hibernate Search是Hibernate ORM框架的一个扩展,它将强大的全文搜索引擎Lucene集成到Java应用程序中,允许开发者在数据库对象上进行复杂的全文...

    \hibernate search in action.rar

    《Hibernate Search In Action》这本书是关于Java开发中Hibernate Search框架的深入指南,它涵盖了这个强大的全文搜索引擎集成工具的各个方面。Hibernate Search允许开发者在Java应用程序中实现高效、灵活的全文搜索...

    Shiro+SpringMVC+Hibernate Search+Hibernate+Bootstrap企业信息管理系统基础框架搭建整合实例代码教程

    Apache Shiro + SpringMVC + Hibernate Search + Hibernate + Bootstrap企业信息管理系统基础框架搭建整合实例代码教程,这是一个典型的Java Web开发中的技术栈组合,用于构建高效、安全的企业级信息系统。...

    hibernate-search-orm-5.0.0.Alpha1.zip

    标题中的“hibernate-search-orm-5.0.0.Alpha1.zip”指的是Hibernate Search ORM的一个早期版本,它是Hibernate框架的一个扩展,提供了在数据库中进行全文搜索和索引的功能。Hibernate是一个广泛使用的Java对象关系...

    Hibernate Search指南

    阅读《Hibernate Search Manual》(hibernate_search_manual.pdf)将帮助你更深入地理解这些概念,并提供详细的API参考和实践指导。通过这份指南,你将能够充分利用 Hibernate Search 的功能,为你的Java应用程序...

    hibernate-search-4.1.0.Final-dist.zip

    《深入理解Hibernate Search 4.1.0.Final:企业级全文检索的基石》 Hibernate Search是Hibernate ORM框架的一个扩展,它将强大的全文搜索引擎Lucene集成到Java应用程序中,为数据库对象提供了高级搜索功能。本篇...

    hibernate-search-4.3.0.Final

    《Hibernate Search 4.3.0.Final:企业级全文搜索引擎集成详解》 Hibernate Search是Hibernate ORM的一个扩展,它提供了一种在Java应用中实现全文搜索功能的方式,使得开发者能够轻松地在数据库中的数据上执行复杂...

    Manning.Hibernate.Search.In.Action.Dec.2008

    8. **案例研究**:通过实际项目案例展示了Hibernate Search在电子商务、内容管理系统等领域的应用,提供了具体的实现细节和最佳实践。 9. **高级主题**:涵盖了如倒排索引原理、自定义分析器开发、以及与其他技术如...

    hibernate-search-4.5.2.Final-dist.zip

    《深入理解Hibernate Search 4.5.2.Final:企业级全文检索的利器》 Hibernate Search是Hibernate ORM框架的一个扩展,它将强大的全文搜索引擎Lucene集成到Java应用程序中,为数据库中的数据提供高效的全文检索能力...

    hibernate4.x jar

    《深入理解Hibernate4.x及其核心组件》 Hibernate4.x作为Java领域中著名的对象关系映射(ORM)框架,...而深入学习和实践,如利用Hibernate Search实现全文检索,将使开发者在处理大数据量和复杂查询时更加游刃有余。

Global site tag (gtag.js) - Google Analytics