Hibernate Search 和 Lucene 的快速介绍

在上篇博客“为你的Hibernate应用程序添加搜索功能的最简单的方法”中我谈到了一些在你应用中整合Hibernate Search的场景,还讲到了一些Hibernate Search以及它与Hibernate Core, Lucene 和Solr之间的联系。这篇博客中我们将快速浏览一个示例(实际上它是一个JUnit测试用例),这个示例将会用Hibernate Core和Java Persistence API(JPA)注解来持久化一个简单实体到一个关系数据库,并且利用Hibernate Search通过Lucene索引的创建/更新来对数据库中更新了的hibernate管理实体进行搜索。

有些碎碎念我嚼的在深入前得先明确一下:

1. 该示例是基于Hibernate Search 4.3.0 , 源码已经被打成Eclipse项目附在文章末位处。你可能需要m2eclipse插件来导入这个项目,或者你也可以直接编译然后运行测试用例。

2.当你在执行新增/更新/删除操作时,Hibernate Search 将自动的生成和维护Lucene索引,不需要写代码去专门维护。

3.基本上靠JPA和Hinernate Search的注解就可以驱动Hibernate框架干大部分有关创建表,持久化测试数据和让Lucene构建和弹出可查询的索引和数据的工作。

4 因为这是个Junit测试,我们会利用H2的内存数据库的优势和Lucene索引能力的优势。如果你想转到硬盘数据库环境中去保存数据和索引,只需要在Hinernate的xml配置文件做少许的改动即可。

5.这篇博客的目的是演示如何用Hinernate Search来让Hibernate管理的实体可查询和如何用Lucene索引来查询。这个演示只是告诉你在基于Hibernate的应用中添加查询功能是个很简单的事。其实Lucene还有很多东西需要了解,例如Text Tonkenizers 和 analyzers 的工作原理到底是啥。并且Lucene和Hibernate Search组合还能干好多牛逼活,我的这片博客仅仅说了个皮毛而已。如果这片文章引起你的注意了,我希望你关注LuceneHinernate Search 项目和其项目网站。

我将会用一个很简单的例子来演示你如何上手Hibernate Search。 在这个例子里 ,我们有一个汽车实体将会被持久化。我们的单元测试会持久化这个实体到我们的H2数据库的内存存储区间里。我会用JPA注解指引Hibernate如何去持久化这个实体。Hibernate会自动在数据库中创建表结构。我还会用Hibernate Search 注解来通知框架给我们的实体在哪一个字段上建立索引并且这个被索引的字段的内容在查询时是否需要返回该字段所存储的数据。最后,我们将把Hibernate 和 Hibernate Search 通过配置文件结合起来并且创建一个Junit 测试用例,该用例会在数据库中生成一些汽车实体并且触发Hibernate Search把要索引的字段发送给Lucene。每一个单元测试的实现方法都通过调用HibernateSearch和Lucene的API来实现我们殊途同归的查询。

下面就是我们希望Hibernate为我们保存的Car实体,我们使用了JPA注解比如@Entity,@Id和@GeneratedValue,它们将分别告诉Hibernate JPA这个类是需要被持久化的,id字段被用作主键,而且我们希望数据库为我们自动生成id值。我们也使用了几个Hibernate Search的注解:

@Indexed: 标明这个实体需要被Lucene创建索引,从而使之可以被检索

@Analyzer: 告诉Hibernate Search来标记它的域以及更新Lucene索引的时候使用哪个Lucene分析器。注意:你以后检索的时候,使用一个与Lucene为你将要检索的文件创建索引的时候使用的分析器相同的分析器是非常重要的。然后使用一个不同的分析器可能也会返回我们想要的结果,但是这得不到保证,所以,总是先研究你选择的用来创建索引和检索的分析器,然后再做出明智的选择。

@DocumentId:标明Car的id字段应该被用作Lucene索引中文档的ID,这几乎总是和数据库中实体的主键是同一个字段。

@Field: 告诉Hibernate Search为该字段创建爱你索引,并且提供一些其他信息,比如该字段在索引中需要被如何处置。

@Entity
@Indexed
@Analyzer(impl = org.apache.lucene.analysis.standard.StandardAnalyzer.class)
public class Car {
 
    @Id
    @GeneratedValue
    @DocumentId
    private Long id;
 
    @Column
    @Field(store = Store.YES)
    private String make;
 
    @Column
    @Field(store = Store.YES)
    private String model;
 
    @Column
    @Field(store = Store.YES)
    private short year;
 
    @Column
    @Field(store = Store.NO)
    private String description;
 
    public Car() {
    }
 
    public Car(String make, String model, short year, String description) {
        super();
        this.make = make;
        this.model = model;
        this.year = year;
        this.description = description;
    }
 
    public String getMake() {
        return make;
    }
    // more getters/setters

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15738.html