Hibernate Search JPA + Lucene 简单应用实例

假设现在有这么一个应用场景。数据库里存放了大量文章,我们想要通过输入关键字,从数据库中检索出相关的文章。

1.建立Article Entity:

public class Article {
	private String id;            //ID
	private String title;         //标题
	private String content;       //内容
        private String isPublication; //发布状态

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getIsPublication() {
		return isPublication;
	}
	public void setIsPublication(String isPublication) {
		this.isPublication = isPublication;
	}
}

2.建立索引:

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.Search;

public class IndexArticle {

	@PersistenceContext
	protected EntityManager entityManager;

	public void indexArticle(){
//		......具体编码不细写了
//		List<Article> articles = articleService.findList(null, null, null, first, count);
//		for (Article article : articless) {
//			index(article);
//		}
	}

	public void index(Article article){
		//Hibernate Search JPA
		FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
		fullTextEntityManager.index(articles);
	}
}

3.检索关键字:

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.Version;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import org.wltea.analyzer.lucene.IKAnalyzer;

import com.dowik.dwshop.mall.entity.Article;

public class SearchArticle {

	@PersistenceContext
	protected EntityManager entityManager;

	public List<Article> searchResult(String keyword){

		try {

			//要搜索的关键词
			keyword = QueryParser.escape(keyword);

			//解析器,中文分词工具
			QueryParser titleParser = new QueryParser(Version.LUCENE_35, "title", new IKAnalyzer());
			titleParser.setDefaultOperator(QueryParser.AND_OPERATOR);
			Query titleQuery = titleParser.parse(keyword);

			//模糊搜索标题
			FuzzyQuery titleFuzzyQuery = new FuzzyQuery(new Term("title", keyword), 0.5F);

			//按词条搜索内容
			Query contentQuery = new TermQuery(new Term("content", keyword));

			//按词条搜索发布状态
			Query isPublicationQuery = new TermQuery(new Term("isPublication", "true"));

			//全文检索(标题搜索+内容搜索)
			BooleanQuery textQuery = new BooleanQuery();
			textQuery.add(titleQuery, Occur.SHOULD);
			textQuery.add(titleFuzzyQuery, Occur.SHOULD);
			textQuery.add(contentQuery, Occur.SHOULD);

			//发布状态+全文检索
			BooleanQuery query = new BooleanQuery();
			query.add(isPublicationQuery, Occur.MUST);
			query.add(textQuery, Occur.MUST);

			//Hibernate Search JPA
			FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
			FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(query, Articles.class);

			List<Article> resultList = fullTextQuery.getResultList();

			return resultList;
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return null;
	}
}

以上三个步骤构建了一个简单的 Hibernate Search JPA + Lucene 简单应用实例。

时间: 2024-10-14 20:39:39

Hibernate Search JPA + Lucene 简单应用实例的相关文章

Hibernate search与Lucene包异常学习心得

最近使用了了一下Hibernate  Search这个组件 这个组件是对域模型进行全文检索,在全文检索的底层实现上使用了Lucene技术 在进行小测试的时候费了很大的力气去搞定包的问题 我直接通过实例进行验证 开始的时候我用的是最新的hibernate—search包,导致的直接问题是各种包不一致 这个问题花了我很长时间,最突出的一个异常就是java.lang.VerifyError 在比较久远的hibernate-search.jar包如:hibernate-search-3.1.0.GA 中

[Hibernate Search] 实体类型的映射

实体类型映射 在上一篇文章中,简要介绍了如何使用Hibernate Search来对一个实体进行全文搜索. 然而,在真实的应用中,实体与实体之间的关系也许更为复杂.为了对复杂实体进行搜索,就需要让底层的Lucene查询也能够理解这些关系. 下图反映了Database,Hibernate,Hibernate Search和Lucene之间的关系: 域映射选项(Field Mapping Options) 我们已经知道@Field注解用来让某个域可以被全文搜索到. 实际上,在添加该注解后,Hiber

[Hibernate Search] 初识Hibernate Search

初识Hibernate Search 要让你的应用具备Hibernate Search赋予的全文搜索的能力,需要做以下三件事: 给项目添加必要的依赖和配置信息 给你的实体类添加必要的信息,从而让Lucene知道如何对它们进行索引(Indexing) 在需要的地方使用符合Hibernate Search规范的查询来完成业务逻辑 对于需要添加的依赖信息,会在以后进行介绍.我们首先来看看代码该如何写. 我们会使用一个类似于经典的"Java Pet Store"那样的Web应用来展示Hiber

[Hibernate Search] (5) 高级查询 - 过滤,投影和分面

高级查询 在介绍了更多的高级映射功能之后,是时候回顾一下之前介绍过的查询功能了,看看如何借助这些高级的映射功能来使用一些高级的查询功能.本文会通过以下几个方面进行介绍: 如何在不和数据库进行任何交互的前提下,借助Lucene的力量来动态的筛选结果 如何通过使用基于投影(Projection)的查询来获取需要的属性,从而避免与数据库的交互 如何使用分面搜索(Faceted Search)对搜索结果进行划分 如何使用查询时提升(Boosting) 如何给查询设置时间限制 过滤(Filtering)

[Hibernate Search] (5) 解析和条件索引

解析(Analysis) 当一个实体域被Lucene索引时,往往还会经历一个语法分析(Parsing)和转换(Conversion)的步骤,这些步骤被称为解析.在前文中,我们提到过Hibernate Search会默认对字符串类型的实体域进行分词,而这个分词过程就需要用到解析器(Analyzer).在需要对实体域进行排序的场合,需要禁用这个默认的分词行为. 在解析过程中,还可以借助Apache Solr提供的组件来完成更多的操作.为了弄清楚Solr组件是如何参与到这个过程中并完成更多的操作,需要

[Hibernate Search] (3) 基础查询

基础查询 眼下我们仅仅用到了基于keyword的查询,实际上Hibenrate Search DSL还提供了其他的查询方式,以下我们就来一探到底. 映射API和查询API 对于映射API.我们能够通过使用Hibernate提供的注解来完毕映射工作.同一时候我们也能够使用JPA提供的注解来完毕.类似的,对于查询API,我们也能够从Hibernate和JPA提供的查询API中进行选择. 每种方式都有它的长处和缺点,比方当我们使用Hibernate提供的查询API时,意味着能够使用很多其它的特性,毕竟

Lucene.Net 入门级实例 浅显易懂。。。

Lucene.Net 阅读目录 开始 Lucene简介 效果图 Demo文件说明 简单使用 重点类的说明 存在问题 调整后 Lucene.Net博文与资源下载 做过站内搜索的朋友应该对Lucene.Net不陌生,没做过的也许会问:就不是个查询嘛!为什么不能使用Like模糊查找呢? 原因很简单--模糊查询的契合度太低,匹配关键字之间不能含有其他内容.最重要的是它会造成数据库全表扫描,效率底下,即使使用视图,也会造成数据库服务器"亚历山大",那LuceneNet又是一个神马东西?如何使用?

Spring MVC注解配置结合Hibernate的入门教程及其代码实例

原文:Spring MVC注解配置结合Hibernate的入门教程及其代码实例 源代码下载地址:http://www.zuidaima.com/share/1787210045197312.htm 1.概述 本文旨在搭建Spring MVC+Hibernate开发框架,通过一个简单的demo讲解Spring MVC的相关配置文件,以及通过注解方式实现简单功能. 开发框架:Spring+Spring MVC+Hibernate(Spring所用的版本为3.0.5). 数据库:MySQL(数据库名称

[Hibernate Search] (4) 实体类型的高级映射功能

高级映射 前面介绍的可搜索的域基本上都是字符串类型,实际上可搜索的类型是非常丰富的. 本文会介绍以下几个方面的内容: Lucene对实体进行索引的过程 借助Solr组件对这个过程的改进 修改域的重要程度,从而让基于相关度的排序更加有意义 动态决定是否对一个实体类型进行索引 桥接器(Bridges) 实体类型中可以使用的类型是无穷无尽的,但是对于Lucene索引而言,任何类型归根到底都会以字符串来表示.所以,在对实体的域进行索引时,这些域最终需要被转换为字符串类型的对象. 在Hibernate S