集成Hibernate Search做全文检索

标签: hibernate search 全文检索 | 发表时间:2013-09-24 06:34 | 作者:zhengwei223
出处:http://blog.csdn.net

版本及依赖:

<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-search-orm</artifactId>
			<version>4.2.0.Final</version>
		</dependency>
<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-smartcn</artifactId>
			<version>3.6.2</version>
		</dependency>


1、修改hibernate主配置文件,增加:

<property name="hibernate.search.default.directory_provider">
			org.hibernate.search.store.impl.FSDirectoryProvider
		</property>
		<property name="hibernate.search.default.indexBase">
			e:\luceneLinde
		</property>

一个是存储的实现,一个是存储的路径


2、给实体类上注解

import javax.persistence.*;

import org.hibernate.annotations.GenericGenerator;

import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;


@Entity
@Table(name = "PAGEINFO")
@Indexed(index="PageInfo")/*标记该表可索引,参数index指定存放索引信息的文件名,路径在主配置文件中指定*/
@Analyzer(impl=SmartChineseAnalyzer.class)//分词器
public class Pageinfo implements java.io.Serializable {
	private static final long serialVersionUID = 5454155825314635342L;


		
	// columns START
//省略1000字
	// columns END

	@Id
	@GeneratedValue(generator = "custom-id")
	@GenericGenerator(name = "custom-id", strategy = "uuid")
	@Column(name = "ID", unique = true, nullable = false, insertable = true, updatable = true, length = 32)
	@DocumentId  /*以字段id作为文档id*/
	public java.lang.String getId() {
		return this.id;
	}

	@Column(name = "TITLE", unique = false, nullable = true, insertable = true, updatable = true, length = 255)
	@Field(store=Store.NO)  /*可索引,但不存储*/
	public java.lang.String getTitle() {
		return this.title;
	}

	@Column(name = "CONTENT", unique = false, nullable = true, insertable = true, updatable = true)
	@Field(store=Store.NO)
	public java.lang.String getContent() {
		return this.content;
	}

	@Column(name = "SOURCE", unique = false, nullable = true, insertable = true, updatable = true)
	@Field(store=Store.NO)
	public java.lang.String getSource() {
		return this.source;
	}


	@Column(name = "SUMMARY", unique = false, nullable = true, insertable = true, updatable = true)
	@Field(store=Store.NO)
	public java.lang.String getSummary() {
		return this.summary;
	}


	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumns({ @JoinColumn(name = "SITE_ID", nullable = false, insertable = false, updatable = false) })
	@IndexedEmbedded(prefix="site_",depth=1)  /*关联检索,如field为site_name实则是按关联表的那么属性检索*/
	public GrabageSiteconfig getGrabageSiteconfig() {
		return grabageSiteconfig;
	}

}

省略了大量东西,如域成员,set方法等,一般以id作为doc的id,其他的你想对哪些字段做全文检索,就使用@Field标记,至于其store属性和lucene中的含义一致,不赘述。


3、使用API

package othertest;

import java.util.Iterator;
import java.util.List;

import javacommon.gather.bean.Pageinfo;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.util.Version;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class SearchTest {
	private static SessionFactory sf;
	
	@BeforeClass
	public static void init() {
		sf = HibernateConfigTest.sf;//弄一个SessionFactory,不多说
		
	}
	@Before
	//执行索引
	public void index(){
		Session session = sf.openSession();
		FullTextSession fullTextSession = Search.getFullTextSession(session);
		//查出结果
		List<Pageinfo> pageinfos = session.createCriteria(Pageinfo.class).list();
		session.beginTransaction();
		//依次建立索引
		for (Iterator iterator = pageinfos.iterator(); iterator.hasNext();) {
			Pageinfo pageinfo = (Pageinfo) iterator.next();
			fullTextSession.index(pageinfo);
		}
		session.getTransaction().commit();
		session.close();
		System.out.println("index over......");
	}

	@Test
	public void searchTest() {
		Session session = sf.openSession();
		FullTextSession fullTextSession = Search.getFullTextSession(session);
		//在字段content中检索
		QueryParser queryParser = new QueryParser(Version.LUCENE_36, "content", new SmartChineseAnalyzer(Version.LUCENE_36));
		Query luceneqQuery=null;
		try {
			//检索含有“大风”的信息
			luceneqQuery = queryParser.parse("大风");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		//执行检索,得到结果集
		FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(luceneqQuery, Pageinfo.class);
		List<Pageinfo> pageinfos = fullTextQuery.list();
		//查看结果做验证
		for (Iterator iterator = pageinfos.iterator(); iterator.hasNext();) {
			Pageinfo pageinfo = (Pageinfo) iterator.next();
			System.out.println(pageinfo.getContent());
		}
	}
}


作者:zhengwei223 发表于2013-9-23 22:34:15 原文链接
阅读:86 评论:0 查看评论

相关 [hibernate search 全文检索] 推荐:

集成Hibernate Search做全文检索

- - CSDN博客架构设计推荐文章
1、修改hibernate主配置文件,增加:. 一个是存储的实现,一个是存储的路径. @Analyzer(impl=SmartChineseAnalyzer.class)//分词器 public class Pageinfo implements java.io.Serializable {. // columns START //省略1000字.

Cloudera Search: 轻松实现Hadoop全文检索

- - Hadoop中国
近期Cloudera Search的推出,对于曾经做信息检索和使用过Lucene/Solr的我来讲,虽然不是那种令人乍舌的新技术,但从应用层面来考虑,我相信,对于业界而言,毫无疑问是一个相当令人兴奋的消息. 想想看,有了集一整套解决方案在手的Cloudera Search在手,现在任何人都可以轻而易举地像使用谷歌百度那样对存储在Hadoop里面的数据进行全文检索了.

浅谈 Semantic Search

- - IT瘾-dev
顾名思义,关键词搜索就是当用户输入关键词( Query),搜索引擎会去搜索并匹配含有 Query的文档,然后返回相关的结果( Response). 一般来说,一个文档包含越多的用户关键词,它在结果中的排序就越靠前. 假设有以下的 Query和 Responses:. 我们可以观察 Responses中每个结果中的词与 Query 中的词,然后找出在  Query和   Response 都出现的词的个数:.

MySQL全文检索笔记

- - 博客园_首页
MySQL 4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型.    其中FULLTEXT(title, body) 给title和body这两列建立全文索引,之后检索的时候注意必须同时指定这两列.    说明全文匹配时忽略大小写.

Hibernate面试题

- - ITeye博客
什么是Hibernate的并发机制. Hibernate并发机制:. a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,. 如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用.

Hibernate Lazy属性

- - 博客园_首页
  Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术. 这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录. 通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销. Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势.

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.

hibernate优化

- - 开源软件 - ITeye博客
原文 http://developer.51cto.com/art/200906/129539.htm. 文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.

JPA & Hibernate 注解

- - CSDN博客编程语言推荐文章
必须,name为可选,对应数据库中一的个表 . 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息 . name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名 . catalog:可选,表示Catalog名称,默认为Catalog(""). .

hibernate 大对象类型的hibernate映射

- - CSDN博客推荐文章
在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应.