天天看點

關于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)
  • 描述: 源代碼與配置檔案