[Hibernate Search] 初识Hibernate Search

初识Hibernate Search

要让你的应用具备Hibernate Search赋予的全文搜索的能力,需要做以下三件事:

  1. 给项目添加必要的依赖和配置信息
  2. 给你的实体类添加必要的信息,从而让Lucene知道如何对它们进行索引(Indexing)
  3. 在需要的地方使用符合Hibernate Search规范的查询来完成业务逻辑

对于需要添加的依赖信息,会在以后进行介绍。我们首先来看看代码该如何写。 我们会使用一个类似于经典的“Java Pet Store”那样的Web应用来展示Hibernate Search的使用方式,这个应用的主要功能是展示一个软件应用的目录。

创建实体类

既然目的是为了展示软件应用,那么首当其冲的实体类就是App类了,现在我们将它定义成下面这样,拥有4个字段:

  • id:主键信息
  • name:App的名字
  • description:App的介绍
  • image:App图片的链接
@Entity
public class App {
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String name;

    @Column(length=1000)
    private String description;

    @Column
    private String image;

    public App() {}
    public App(String name, String image, String description) {
        this.name = name;
        this.image = image;
        this.description = description;
    }
    // 省略了众多的getter和setter
}

为使用Hibernate
Search而修改实体类

有了实体类型后,我们需要告诉Hibernate Search如何来利用Lucene对该实体进行管理。

在最基本的场景中,我们只需要向该实体类型添加两个注解:

首先是添加@Indexed注解:

import org.hibernate.search.annotations.Indexed;

@Entity
@Indexed
public class App implements Serializable
// ...

这个注解告诉Lucene去为App实体类型创建索引。注意,并不是每个实体类型都需要这个注解,只有确定将会作为搜索目标的实体类才需要使用它。

其次,需要向具体的字段添加@Field注解:

import org.hibernate.search.annotations.Field;

// ...

@Id
@GeneratedValue
private Long id;

@Column
@Field
private String name;

@Column(length=1000)
@Field
private String description;

@Column
private String image;

// ...

这里我们向name和description字段添加了@Field注解,表示这两个字段将会作为搜索的目标字段。同时注意到image字段并没有被@Field标注,这是因为我们不需要将图片的名字也作为可搜索的字段。

建立查询

向实体类添加了必要的注解后,我们就可以对它们建立查询了。主要会使用到FullTextSession和QueryBuilder类型:

import org.hibernate.Session;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;

// ...

Session session = StartupDataLoader.openSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.beginTransaction();

// ...

首先建立一个Session并开始一个事务。紧接着,就需要通过传入的关键字(Keyword)来建立查询了:

import org.hibernate.search.query.dsl.QueryBuilder;

// ...

String searchString = request.getParameter("searchString");
QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
    .buildQueryBuilder().forEntity( App.class ).get();
org.apache.lucene.search.Query luceneQuery = queryBuilder
    .keyword()
    .onFields("name", "description")
    .matching(searchString)
    .createQuery();

非常直观的代码,forEntity用来指定对哪个实体进行查询,onFields用来指定对哪些字段进行查询。 将上面的代码翻译成更加容易理解的语言是这样的:

为App实体的name和description字段创建一个匹配searchString参数的基于关键字的查询。

这因为这种API的设计十分流畅,它也被称为Hibernate Search DSL(Domain-Specific Language)。 另外,注意到以上的queryBuilder对象创建的查询类型是org.apache.lucene.search.Query。这就是Hibernate Search和Lucene建立联系的一种方式。在Lucene得到搜索结果后,类似地也会将结果转换成一个org.hibernate.Query对象:

org.hibernate.Query hibernateQuery = fullTextSession.createFullTextQuery(luceneQuery, App.class);
List<App> apps = hibernateQuery.list();
request.setAttribute("apps", apps);

因此,Hibernate Search封装了大量的Lucene使用细节,让只了解Hibernate的开发人员也能够轻松的为应用加上全文搜索功能。

建立工程并导入Hibernate
Search

这里我们考虑使用maven时需要添加的依赖,最关键的就是:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-search</artifactId>
    <version>4.2.0.Final</version>
</dependency>

对于测试环境,往往还可以利用内存数据库h2:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.3.168</version>
</dependency>
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>

当然,具体的版本号会根据你的需求而有所不同。

时间: 2024-10-18 10:57:15

[Hibernate Search] 初识Hibernate Search的相关文章

蜗牛—Hibernate之初识配置

下载Hibernate的jar包 把以下jar文件考到项目lib下 然后在myeclipse中打开database的view视图创建一个新的数据库连接 接下来,配置连接,需要导入ORACLE的jar包 我创建的连接名为wjj 然后在项目中加入Hibernate的配置信息,可以用刚才创建的数据库连接用myeclipse生成 首先,点击项目右键 接下来,需要把那些划红线的东西勾掉 next next,,DB Driver用刚才创建的数据库连接即可 最后,勾掉此选项 最后在项目的src项目里产生此文件

Hibernate框架 初识 ORM概念 搭建Hibernate环境 Hibernate Api

ORM概念 在学习 Hibernate 之前,我们先来了解ORM   对象关系映射 O, Object  对象 R,Realtion 关系  (关系型数据库: MySQL, Oracle…) M,Mapping  映射 ORM, 解决什么问题? 存储:   能否把对象的数据直接保存到数据库? 获取:   能否直接从数据库拿到一个对象? 想做到上面2点,必须要有映射!   总结:          Hibernate与ORM的关系?             Hibernate是ORM的实现,简化对

Hibernate学习:初识hibernate

一:S2SH框架流程图 hibernate的作用就是在Dao层将model的数据持久化到DB数据库. 这幅图上没有标记spring, 其实spring贯穿整个过程: spring面向接口编程: spring将service注入到Action, spring将dao注入到service spring针对servic进行声明式的事务管理. 二:单独看hibernate hibernate的工作原理: step1:创建Configuration:进行配置文件的装载操作,提取所有配置文件进行解析. st

初识hibernate框架之一:进行简单的增删改查操作

Hibernate的优势 l 优秀的Java 持久化层解决方案  (DAO) l 主流的对象—关系映射工具产品 l 简化了JDBC 繁琐的编码 l 将数据库的连接信息都存放在配置文件 l 自己的ORM框架 l 一定要手动实现Hibernate(模拟Hibernate实现) 一:创建一个java project项目 如下图 2:创建一个大配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hib

hibernate学习笔记之二(初识hibernate)

(hibernate学习笔记系列来自于 "疯狂Java" 视频学习) Hibernate概述 免费开源Java包,可以使程序和数据库的交互变得容易,并更加符合面向对象的设计. 持久化:将数据保存到数据库中 hibernate持久化类步骤 环境搭建 导入jar包,在hibernate包里的\lib\required文件夹里 导入mysql的JDBC驱动 将上述包添加到路径里面 编写持久化类 要求: 在持久化类中一般需要一个id,通常用Integer类型,这样之后操作会使用null,而不是

初识Hibernate的主配置和映射配置

Hibernate.cfg.xml 主配置 Hibernate.cfg.xml 主配置文件夹中主要配置:数据库链接配置,其他参数配置,映射信息等. 常用配置查看源码: hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties session-factory 节点: 一般来说一个数据库对应着一个session-factory节点. 1.数据库链接配置:(以mysql为例子)       hibernate.propert

Hibernate 第一个Hibernate应用程序

Chapter 1. Tutorial   第一章 使用说明书 Table of Contents   目录 1.1. Part 1 - The first Hibernate Application   第一节 第一个Hibernate应用程序 1.1.1. Setup   设置开发环境 1.1.2. The first class  创建第一个类 1.1.3. The mapping file  创建类与数据库表的映射文件 1.1.4. Hibernate configuration  Hi

Word Search 和 Word Search Ⅱ

Word Search 和 Word Search Ⅱ Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighbo

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not

遇到这个问题之前,我去百度和谷歌去搜索了一下,发现各种说法,但是针对我的项目而言,也就是公司的项目而言,这个问题的根源并非是网上所说的那样. 最后是通过自己的想法做测试得到了解决. 1.首先说说我的配置吧!我的配置是通过spring自带的注解来实现 声明式事物管理的.如果我们没去了解spring的声明式事物管理的话,或许我们是得不出什么结论的. 如果你配置过声明式事物管理,你就知道spring是怎么帮你管理的. 2.spring声明式事物管理是在service层管理的,关于到sessionFac