天天看点

关于Hibernate Search转载文章

1、创建POJO

关于Hibernate Search转载文章

package  com.yehui;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import  javax.persistence.CascadeType;

关于Hibernate Search转载文章

import  javax.persistence.Column;

关于Hibernate Search转载文章

import  javax.persistence.Entity;

关于Hibernate Search转载文章

import  javax.persistence.GeneratedValue;

关于Hibernate Search转载文章

import  javax.persistence.GenerationType;

关于Hibernate Search转载文章

import  javax.persistence.Id;

关于Hibernate Search转载文章

import  javax.persistence.JoinColumn;

关于Hibernate Search转载文章

import  javax.persistence.ManyToOne;

关于Hibernate Search转载文章

import  javax.persistence.Table;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import  org.hibernate.search.annotations.DocumentId;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Field;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Index;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Indexed;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.IndexedEmbedded;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Store;

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

@Entity

关于Hibernate Search转载文章
关于Hibernate Search转载文章

@Table(name  =   " employee " , catalog  =   " hise " , uniqueConstraints  =   {} )

关于Hibernate Search转载文章

@Indexed(index  =   " indexes/employee " )

关于Hibernate Search转载文章
关于Hibernate Search转载文章

public   class  Employee  implements  java.io.Serializable  {

关于Hibernate Search转载文章

    private static final long serialVersionUID = 7794235365739814541L;

关于Hibernate Search转载文章

    private Integer empId;

关于Hibernate Search转载文章

    private String empName;

关于Hibernate Search转载文章

    private Department dept;

关于Hibernate Search转载文章

    private String empNo;

关于Hibernate Search转载文章

    private Double empSalary;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    // Constructors

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Employee() {

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Employee(Integer empId){

关于Hibernate Search转载文章

        this.empId = empId;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Employee(Integer empId, String empName,

关于Hibernate Search转载文章
关于Hibernate Search转载文章

            String empNo, Double empSalary){

关于Hibernate Search转载文章

        this.empId = empId;

关于Hibernate Search转载文章

        this.empName = empName;

关于Hibernate Search转载文章

        this.empNo = empNo;

关于Hibernate Search转载文章

        this.empSalary = empSalary;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    // Property accessors

关于Hibernate Search转载文章

    @Id

关于Hibernate Search转载文章

    @GeneratedValue(strategy = GenerationType.AUTO)

关于Hibernate Search转载文章

    @Column(name = "emp_id", unique = true, nullable = false, insertable = true, updatable = true)

关于Hibernate Search转载文章

    @DocumentId

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Integer getEmpId() {

关于Hibernate Search转载文章

        return this.empId;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setEmpId(Integer empId) {

关于Hibernate Search转载文章

        this.empId = empId;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Column(name = "emp_name", unique = false, nullable = true, insertable = true, updatable = true, length = 30)

关于Hibernate Search转载文章

    @Field(name="name", index=Index.TOKENIZED, store=Store.YES)

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public String getEmpName() {

关于Hibernate Search转载文章

        return this.empName;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setEmpName(String empName) {

关于Hibernate Search转载文章

        this.empName = empName;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Column(name = "emp_no", unique = false, nullable = true, insertable = true, updatable = true, length = 30)

关于Hibernate Search转载文章

    @Field(index=Index.UN_TOKENIZED)

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public String getEmpNo() {

关于Hibernate Search转载文章

        return this.empNo;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setEmpNo(String empNo) {

关于Hibernate Search转载文章

        this.empNo = empNo;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Column(name = "emp_salary", unique = false, nullable = true, insertable = true, updatable = true, precision = 7)

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Double getEmpSalary(){

关于Hibernate Search转载文章

        return this.empSalary;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setEmpSalary(Double empSalary) {

关于Hibernate Search转载文章

        this.empSalary = empSalary;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @ManyToOne(cascade = CascadeType.ALL)

关于Hibernate Search转载文章

    @JoinColumn(name="dept_id")

关于Hibernate Search转载文章

    @IndexedEmbedded(prefix="dept_", depth=1)

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Department getDept() {

关于Hibernate Search转载文章

        return dept;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setDept(Department dept) {

关于Hibernate Search转载文章

        this.dept = dept;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

}

关于Hibernate Search转载文章

package  com.yehui;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import  java.util.List;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import  javax.persistence.Column;

关于Hibernate Search转载文章

import  javax.persistence.Entity;

关于Hibernate Search转载文章

import  javax.persistence.GeneratedValue;

关于Hibernate Search转载文章

import  javax.persistence.GenerationType;

关于Hibernate Search转载文章

import  javax.persistence.Id;

关于Hibernate Search转载文章

import  javax.persistence.OneToMany;

关于Hibernate Search转载文章

import  javax.persistence.Table;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import  org.hibernate.search.annotations.ContainedIn;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.DocumentId;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Field;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Index;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Indexed;

关于Hibernate Search转载文章

import  org.hibernate.search.annotations.Store;

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

@Entity

关于Hibernate Search转载文章
关于Hibernate Search转载文章

@Table(name  =   " department " , catalog  =   " hise " , uniqueConstraints  =   {} )

关于Hibernate Search转载文章

@Indexed(index = " indexes/department " )

关于Hibernate Search转载文章
关于Hibernate Search转载文章

public   class  Department  implements  java.io.Serializable  {

关于Hibernate Search转载文章

    private static final long serialVersionUID = 7891065193118612907L;

关于Hibernate Search转载文章

    private Integer deptId;

关于Hibernate Search转载文章

    private String deptNo;

关于Hibernate Search转载文章

    private String deptName;

关于Hibernate Search转载文章

    private List<Employee> empList;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    // Constructors

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @OneToMany(mappedBy="dept")

关于Hibernate Search转载文章

    @ContainedIn

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public List<Employee> getEmpList() {

关于Hibernate Search转载文章

        return empList;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setEmpList(List<Employee> empList) {

关于Hibernate Search转载文章

        this.empList = empList;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Department() {

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Department(Integer deptId) {

关于Hibernate Search转载文章

        this.deptId = deptId;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Department(Integer deptId, String deptNo, String deptName) {

关于Hibernate Search转载文章

        this.deptId = deptId;

关于Hibernate Search转载文章

        this.deptNo = deptNo;

关于Hibernate Search转载文章

        this.deptName = deptName;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    // Property accessors

关于Hibernate Search转载文章

    @Id

关于Hibernate Search转载文章

    @GeneratedValue(strategy=GenerationType.AUTO)

关于Hibernate Search转载文章

    @Column(name = "dept_id", unique = true, nullable = false, insertable = true, updatable = true)

关于Hibernate Search转载文章

    @DocumentId

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public Integer getDeptId() {

关于Hibernate Search转载文章

        return this.deptId;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setDeptId(Integer deptId) {

关于Hibernate Search转载文章

        this.deptId = deptId;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Column(name = "dept_no", unique = false, nullable = true, insertable = true, updatable = true, length = 30)

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public String getDeptNo() {

关于Hibernate Search转载文章

        return this.deptNo;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setDeptNo(String deptNo) {

关于Hibernate Search转载文章

        this.deptNo = deptNo;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Column(name = "dept_name", unique = false, nullable = true, insertable = true, updatable = true, length = 30)

关于Hibernate Search转载文章

    @Field(name="name", index=Index.TOKENIZED,store=Store.YES)

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public String getDeptName() {

关于Hibernate Search转载文章

        return this.deptName;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setDeptName(String deptName) {

关于Hibernate Search转载文章

        this.deptName = deptName;

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章

}          不了解Hibernate映射相关的Annotation的朋友可以到Hibernate的官方网站下载Hibernate Annotation Reference,有http://wiki.redsaga.com/翻译的中文文档。当然,也可以直接使用hbm.xml文件。

        Hibernate Search相关的Annotation主要有两个:

         @Indexed                标识需要进行索引的对象,

         属性        index         指定索引文件的路径

          @Field                     标注在类的get属性上,标识一个索引的Field

          属性       index         指定是否索引,与Lucene相同

                         store         指定是否索引,与Lucene相同

                         name        指定Field的name,默认为类属性的名称

                         analyzer    指定分析器

         另外@IndexedEmbedded  与  @ContainedIn 用于关联类之间的索引

          @IndexedEmbedded有两个属性,一个prefix指定关联的前缀,一个depth指定关联的深度

          如上面两个类中Department类可以通过部门名称name来索引部门,在Employee与部门关联的前缀为dept_,因此可以通过部门名称dept_name来索引一个部门里的所有员工。

2、配置文件

关于Hibernate Search转载文章

<? xml version='1.0' encoding='UTF-8' ?>

关于Hibernate Search转载文章

<! DOCTYPE hibernate-configuration PUBLIC

关于Hibernate Search转载文章

          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

关于Hibernate Search转载文章

          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >

关于Hibernate Search转载文章
关于Hibernate Search转载文章

< hibernate-configuration >

关于Hibernate Search转载文章
关于Hibernate Search转载文章

< session-factory >

关于Hibernate Search转载文章

     < property  name ="hibernate.dialect" >

关于Hibernate Search转载文章

        org.hibernate.dialect.MySQLDialect

关于Hibernate Search转载文章

     </ property >

关于Hibernate Search转载文章

     < property  name ="hibernate.connection.url" >

关于Hibernate Search转载文章

        jdbc:mysql://localhost:3306/hise

关于Hibernate Search转载文章

     </ property >

关于Hibernate Search转载文章

     < property  name ="hibernate.connection.username" > root </ property >

关于Hibernate Search转载文章

     < property  name ="hibernate.connection.password" > 123456 </ property >

关于Hibernate Search转载文章

     < property  name ="hibernate.connection.driver_class" >

关于Hibernate Search转载文章

        com.mysql.jdbc.Driver

关于Hibernate Search转载文章

     </ property >

关于Hibernate Search转载文章
关于Hibernate Search转载文章

     < property  name ="hibernate.search.default.directory_provider" >

关于Hibernate Search转载文章

        org.hibernate.search.store.FSDirectoryProvider

关于Hibernate Search转载文章

     </ property >

关于Hibernate Search转载文章

     < property  name ="hibernate.search.default.indexBase" > e:/index </ property >

关于Hibernate Search转载文章
关于Hibernate Search转载文章

     < mapping  class ="com.yehui.Employee"   />

关于Hibernate Search转载文章

     < mapping  class ="com.yehui.Department"   />

关于Hibernate Search转载文章

</ session-factory >

关于Hibernate Search转载文章
关于Hibernate Search转载文章

</ hibernate-configuration > 如果使用JPA,配置文件为

关于Hibernate Search转载文章

<? xml version="1.0" encoding="UTF-8" ?>

关于Hibernate Search转载文章

< persistence  xmlns ="http://java.sun.com/xml/ns/persistence"

关于Hibernate Search转载文章

    xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"

关于Hibernate Search转载文章

    xsi:schemaLocation ="http://java.sun.com/xml/ns/persistence

关于Hibernate Search转载文章

    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"  version ="1.0" >

关于Hibernate Search转载文章
关于Hibernate Search转载文章

     < persistence-unit  name ="jpaPU"  transaction-type ="RESOURCE_LOCAL" >

关于Hibernate Search转载文章

         < provider > org.hibernate.ejb.HibernatePersistence </ provider >

关于Hibernate Search转载文章

         < class > com.yehui.Department </ class >

关于Hibernate Search转载文章

         < class > com.yehui.Employee </ class >

关于Hibernate Search转载文章

         < properties >

关于Hibernate Search转载文章

             < property  name ="hibernate.connection.driver_class"

关于Hibernate Search转载文章

                value ="com.mysql.jdbc.Driver"   />

关于Hibernate Search转载文章

             < property  name ="hibernate.connection.url"

关于Hibernate Search转载文章

                value ="jdbc:mysql://localhost:3306/hise"   />

关于Hibernate Search转载文章

             < property  name ="hibernate.connection.username"  value ="root"   />

关于Hibernate Search转载文章

             < property  name ="hibernate.connection.password"

关于Hibernate Search转载文章

                value ="123456"   />

关于Hibernate Search转载文章

             < property  name ="hibernate.search.default.directory_provider"  

关于Hibernate Search转载文章

                value ="org.hibernate.search.store.FSDirectoryProvider" />

关于Hibernate Search转载文章

             < property  name ="hibernate.search.default.indexBase"  

关于Hibernate Search转载文章

                value ="e:/index" />

关于Hibernate Search转载文章

         </ properties >

关于Hibernate Search转载文章

     </ persistence-unit >

关于Hibernate Search转载文章
关于Hibernate Search转载文章

</ persistence > 主要就是添加两个属性, hibernate.search.default.directory_provider指定Directory的代理,即把索引的文件保存在硬盘中( org.hibernate.search.store.FSDirectoryProvider)还是内存里( org.hibernate.search.store.RAMDirectoryProvider),保存在硬盘的话 hibernate.search.default.indexBase属性指定索引保存的路径。

3、测试代码

关于Hibernate Search转载文章

package  com.yehui;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import   static  junit.framework.Assert.assertNotNull;

关于Hibernate Search转载文章

import   static  junit.framework.Assert.assertTrue;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import  java.util.List;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

import  org.apache.lucene.analysis.StopAnalyzer;

关于Hibernate Search转载文章

import  org.apache.lucene.queryParser.QueryParser;

关于Hibernate Search转载文章

import  org.hibernate.Query;

关于Hibernate Search转载文章

import  org.hibernate.Session;

关于Hibernate Search转载文章

import  org.hibernate.SessionFactory;

关于Hibernate Search转载文章

import  org.hibernate.Transaction;

关于Hibernate Search转载文章

import  org.hibernate.cfg.AnnotationConfiguration;

关于Hibernate Search转载文章

import  org.hibernate.search.FullTextSession;

关于Hibernate Search转载文章

import  org.hibernate.search.Search;

关于Hibernate Search转载文章

import  org.junit.After;

关于Hibernate Search转载文章

import  org.junit.Before;

关于Hibernate Search转载文章

import  org.junit.BeforeClass;

关于Hibernate Search转载文章

import  org.junit.Test;

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

public   class  SearchResultsHibernate  {

关于Hibernate Search转载文章

    private static SessionFactory sf = null;

关于Hibernate Search转载文章

    private static Session session = null;

关于Hibernate Search转载文章

    private static Transaction tx = null;

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @BeforeClass

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public static void setupBeforeClass() throws Exception {

关于Hibernate Search转载文章

        sf = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        assertNotNull(sf);

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Before

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void setUp() throws Exception {

关于Hibernate Search转载文章

        session = sf.openSession();

关于Hibernate Search转载文章

        tx = session.beginTransaction();

关于Hibernate Search转载文章

        tx.begin();

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @After

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void tearDown() throws Exception {

关于Hibernate Search转载文章

        tx.commit();

关于Hibernate Search转载文章

        session.close();

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public static void tearDownAfterClass() throws Exception {

关于Hibernate Search转载文章

        if (sf != null)

关于Hibernate Search转载文章

            sf.close();

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Test

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void testAddDept() throws Exception {

关于Hibernate Search转载文章

        Department dept = new Department();

关于Hibernate Search转载文章

        dept.setDeptName("Market");

关于Hibernate Search转载文章

        dept.setDeptNo("6000");

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        Employee emp = new Employee();

关于Hibernate Search转载文章

        emp.setDept(dept);

关于Hibernate Search转载文章

        emp.setEmpName("Kevin");

关于Hibernate Search转载文章

        emp.setEmpNo("KGP1213");

关于Hibernate Search转载文章

        emp.setEmpSalary(8000d);

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        session.save(emp);

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Test

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void testFindAll() throws Exception {

关于Hibernate Search转载文章

        Query query = session.createQuery("from Department");

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        List<Department> deptList = query.list();

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        assertTrue(deptList.size() > 0);

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Test

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void testIndex() throws Exception {

关于Hibernate Search转载文章

        FullTextSession fullTextSession = Search.createFullTextSession(session);

关于Hibernate Search转载文章

        assertNotNull(session);

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        QueryParser parser = new QueryParser("name", new StopAnalyzer());

关于Hibernate Search转载文章

        org.apache.lucene.search.Query luceneQuery = parser

关于Hibernate Search转载文章

                .parse("name:Kevin");

关于Hibernate Search转载文章

        Query hibQuery = fullTextSession.createFullTextQuery(luceneQuery,

关于Hibernate Search转载文章

                Employee.class);

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        List list = hibQuery.list();

关于Hibernate Search转载文章

        assertTrue(list.size() > 0);

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    @Test

关于Hibernate Search转载文章
关于Hibernate Search转载文章

    public void testIndex2() throws Exception {

关于Hibernate Search转载文章

        FullTextSession fullTextSession = Search.createFullTextSession(session);

关于Hibernate Search转载文章

        assertNotNull(session);

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        QueryParser parser = new QueryParser("dept_name", new StopAnalyzer());

关于Hibernate Search转载文章

        org.apache.lucene.search.Query luceneQuery = parser

关于Hibernate Search转载文章

                .parse("dept_name:Market");

关于Hibernate Search转载文章

        Query hibQuery = fullTextSession.createFullTextQuery(luceneQuery,

关于Hibernate Search转载文章

                Employee.class);

关于Hibernate Search转载文章
关于Hibernate Search转载文章

        List list = hibQuery.list();

关于Hibernate Search转载文章

        assertTrue(list.size() > 0);

关于Hibernate Search转载文章

    }

关于Hibernate Search转载文章

}

测试通过。OK

原文:http://blog.csdn.net/yanghuw/archive/2007/09/30/1808011.aspx

-------------------------------------------------------------------------------------------------------------------------------------

不久前Hibernate推出了Hibernate Search 3.0 GA,由它的名字大家也可以大概猜到它的作用是对数据库中的数据进行检索的。它是hibernate对著名的全文检索系统Lucene的一个集成方案,作用在于对数据表中某些内容庞大的字段(如声明为text的字段)建立全文索引,这样通过hibernate search就可以对这些字段进行全文检索后获得相应的POJO,从而加快了对内容庞大字段进行模糊搜索的速度(sql语句中like匹配)。

Hibernate Search运行的环境如下:

1、JDK或JRE 5.0以上

2、Hibernate-Search以及相应的依赖包

3、Hibernate Core 3.2.X

4、Hibernate Annotations 3.3.X

一、配置

使用过Lucene的人都知道,Lucene是使用Directory这个概念来存储索引文件的,所以在Hibernate Search中提供了一个初始化、配置化的工厂类DirectoryProvider来生成相应的Directory。而在这里,我使用了FSDirectoryProvider这个工厂类,其中FS代表文件系统,意思是索引文件保存在文件系统中。因此,我们在hibernate.cfg.xml文件中加入了一下内容:

xml 代码

  1. <property name="hibernate.search.default.directory_provider">  
  2.           org.hibernate.search.store.FSDirectoryProvider   
  3. </property>  
  4. <property name="hibernate.search.default.indexBase">  
  5.           E:/temp/index   
  6. </property>  

其中属性hibernate.search.default.indexBase代表索引文件默认的保存位置。

这些属性设置完成后,接下来就是使用Annotation对指定POJO的指定属性进行配置了。如下:

java 代码

  1. @Indexed(index = "text")   
  2. public class Text implements java.io.Serializable   
  3. {   
  4.     @DocumentId  
  5.     private Integer id;   
  6.     private String fileName;   
  7.     private String filePath;   
  8.     @Field(name = "content", store = Store.NO, index = Index.TOKENIZED, analyzer = @Analyzer(impl = ChineseAnalyzer.class))   
  9.     private String content;   
  10.     ......   
  11. }  

其中@Indexed用于标示需要建立全文索引的实体类,它包含一个属性index用于标示这个全文索引的名字

@DocumentId用于标示实体类中的唯一的属性保存在索引文件中,是当进行全文检索时可以这个唯一的属性来区分索引中其他实体对象,一般使用实体类中的主键属性

@Field就是用来标示Lucene的Field字段,其中name属性用于标示Field的名称,store属性用于标示这个属性的内容是否需要保存在索引中,index属性标示该字段属性是否进行分词(Index.TOKENIZED),analyzer用于标示建立索引时所使用的分析器是什么类,这里使用Lucene自带的ChineseAnalyzer

二、建立索引

配置完成以上设置之后,Hibernate Search的配置工作算是大功告成了,剩下的就是如何在编码时使用到Hibernate Search。其实Hibernate Search的使用与我们平时Hibernate的使用基本一致,索引的建立工作是可以由Hibernate Search后台自动处理的,无需手工操作,其中的主要差别有

1、Configuration

由于本文中Hibernate Search配置是由Annotation来完成的,所以我们在初始化Configuration、SessionFactory、Session时应该这样写:

java 代码

  1. factory = new AnnotationConfiguration().configure(file).buildSessionFactory();  

使用AnnotationConfiguaration来代理平常使用的Configuration

2、Session

要使用Hibernate Search的功能就不能单纯使用平常的Session来开始事务,进行数据库操作,而是应该改用FullTextSession

java 代码

  1. //获取Session   
  2. Session session = HibernateUtil.getSession();   
  3. //封装Session为FullTextSession   
  4. FullTextSession fullTextSession = Search.createFullTextSession(session);   
  5. //开始事务   
  6. Transaction tx = fullTextSession.beginTransaction();   
  7. ......   
  8. //提交事务   
  9. tx.commit();   
  10. //关闭会话   
  11. fullTextSession.close();  

这样,我们使用FullTextSession进行save,update,delete操作hibernate search将会自动根据配置在后台对相应的域建立全文索引了

三、检索

接下来就是说一下如何使用全文检索功能来检索实体对象了。

java 代码

  1. Session session = HibernateUtil.getSession();   
  2. FullTextSession fullTextSession = Search.createFullTextSession(session);   
  3. Transaction tx = fullTextSession.beginTransaction();   
  4. QueryParser parser = new QueryParser("content", new ChineseAnalyzer());   
  5. Query query = fullTextSession.createFullTextQuery(parser.parse(word),   
  6.         Text.class);   
  7. List result = query.list();   
  8. for (int i = 0; result != null && i < result.size(); i++)   
  9. {   
  10.     Text pojo = (Text) result.get(i);   
  11.     System.out.println("文件名:" + pojo.getFileName());   
  12.     System.out.println("文件路径:" + pojo.getFilePath());   
  13.     System.out.println();   
  14. }   
  15. tx.commit();   
  16. fullTextSession.close();  

首先是建立相应的QueryParser由他来对输入的关键字进行切分后产生Lucene下的Query实例,最后通过FullTextSession的createFullTextQuery方法生成hibernate下的Query实例,执行list方法即可获得查询的实例结果集合。

四、完

以上便是今天我对Hibernate Search的一个尝试,属于很基础很基础的入门,希望可以对大家能有一些启发跟帮助,随文附带我的源代码

  • src.zip (5.8 KB)
  • 描述: 源代码与配置文件