[hibernate] hibernate-search 基础使用

hibernate-search 是基于lucene的集成搜索实现。

项目的jar依赖:

 <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.3.1.Final</version>
    </dependency>

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

idea.iml中jar信息:

 <orderEntry type="library" name="Maven: junit:junit:4.11" level="project" />
    <orderEntry type="library" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate-core:4.3.1.Final" level="project" />
    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.1.3.GA" level="project" />
    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging-annotations:1.2.0.Beta1" level="project" />
    <orderEntry type="library" name="Maven: org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final" level="project" />
    <orderEntry type="library" name="Maven: dom4j:dom4j:1.6.1" level="project" />
    <orderEntry type="library" name="Maven: xml-apis:xml-apis:1.0.b2" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate.common:hibernate-commons-annotations:4.0.4.Final" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final" level="project" />
    <orderEntry type="library" name="Maven: org.javassist:javassist:3.18.1-GA" level="project" />
    <orderEntry type="library" name="Maven: antlr:antlr:2.7.7" level="project" />
    <orderEntry type="library" name="Maven: org.jboss:jandex:1.1.0.Final" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate-search:4.5.0.Final" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate-search-orm:4.5.0.Final" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate-search-engine:4.5.0.Final" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-core:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.avro:avro:1.7.5" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-core-asl:1.9.13" level="project" />
    <orderEntry type="library" name="Maven: org.codehaus.jackson:jackson-mapper-asl:1.9.13" level="project" />
    <orderEntry type="library" name="Maven: com.thoughtworks.paranamer:paranamer:2.3" level="project" />
    <orderEntry type="library" name="Maven: org.apache.commons:commons-compress:1.4.1" level="project" />
    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.6.4" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-facet:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.hibernate:hibernate-search-analyzers:4.5.0.Final" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-analyzers:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.solr:solr-analysis-extras:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.solr:solr-core:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.solr:solr-solrj:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-highlighter:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-kuromoji:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-memory:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-misc:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-phonetic:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-spatial:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-spellchecker:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-grouping:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.6" level="project" />
    <orderEntry type="library" name="Maven: commons-io:commons-io:2.1" level="project" />
    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.6" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-smartcn:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: org.apache.lucene:lucene-stempel:3.6.2" level="project" />
    <orderEntry type="library" name="Maven: com.oracle:ojdbc14:10.2.0.4.0" level="project" />

 

1.hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration XSD 4.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>

 
    <property name="dialect">
        org.hibernate.dialect.OracleDialect
    </property>
    <property name="connection.url">
        jdbc:oracle:thin:@localhost:1521:orcl
    </property>
    <property name="connection.username">dataprocess</property>
    <property name="connection.password">dataprocess</property>
    <property name="connection.driver_class">
        oracle.jdbc.OracleDriver
    </property>
    <property name="myeclipse.connection.profile">hibernate</property>
    <property name="format_sql">true</property>
    <property name="show_sql">true</property>
  
      
    <property name="hibernate.search.default.directory_provider">
        org.hibernate.search.store.impl.FSDirectoryProvider
    </property>

    <property name="hibernate.search.default.indexBase">
        D:\hibernate_index
    </property>

    <mapping class="com.xwolf.hibernate.bean.Comments" />
</session-factory>

</hibernate-configuration>

2.Comments.java

具体索引注解参考官网的示例:http://hibernate.org/search/documentation/getting-started/

package com.xwolf.hibernate.bean;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.hibernate.search.annotations.*;
import org.hibernate.search.annotations.Index;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name="COMMENTS",schema="dataprocess")
@Indexed //索引当前类
@Analyzer(impl= CJKAnalyzer.class)
public class Comments {
    
    private Long id ;
    
    
    private String content;
    
    
    private String title ;
    
    
    private String author ;
    
    
    private Date ctime ;
    
    
    private String remark;
    
    
    private String status ;
    
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id",length=15,unique=true,nullable=false,columnDefinition="java.lang.Long")
    @DocumentId
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    
    @Column(name="CONTENT",length=200,nullable=false,columnDefinition="java.lang.String")
    @Field(store=Store.YES,index = Index.YES,name = "content")
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    
    @Column(name="TITLE",length=200,columnDefinition="java.lang.String")
    @Field(store=Store.YES,index = Index.YES,name = "title")
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    
    @Column(name="AUTHOR",length=200,columnDefinition="java.lang.String")
    @Field(index = Index.YES,store=Store.YES,name = "author")
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    
    @Column(name="CREATE_TIME",columnDefinition="java.util.Date")
    @Field(index = Index.YES,store=Store.YES,name = "createTime")
    public Date getCtime() {
        return ctime;
    }
    public void setCtime(Date ctime) {
        this.ctime = ctime;
    }
    
    @Column(name="REMARK",columnDefinition="java.lang.String")
    @Field(index = Index.YES,store=Store.YES,name = "remark")
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    
    @Column(name="STATUS")
    @Field(store=Store.YES,index = Index.YES,name ="status")
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    @Override
    public String toString() {
        return "Comments [author=" + author + ", content=" + content
                + ", ctime=" + ctime + ", id=" + id + ", remark=" + remark
                + ", status=" + status + ", title=" + title + "]";
    }
   
}

3.测试

package com.xwolf.hibernate.test;

import com.xwolf.hibernate.bean.Comments;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.util.Version;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.net.URL;
import java.util.Date;
import java.util.Iterator;
import java.util.List;


public class TestSearch {
    
private static Session session ;
    
    @Before
    public void before(){
        Configuration configuration = new Configuration();
        URL url =TestSearch.class.getResource("" +
                "/hibernate.cfg.xml");
        configuration.configure(url);
        SessionFactory sessionFactory=configuration.buildSessionFactory();
        session=sessionFactory.openSession();
        System.out.println("session 开启.....");
    }
    
    @Test
    public void test1(){
        
        Comments comments = new Comments();
        comments.setId(12l);
        comments.setAuthor("Solr集成");
        comments.setContent("Solr集成测试...");
        comments.setRemark("Hibernate  Solr,search,Ehcache 集成测试..");
        comments.setStatus("0");
        comments.setTitle("Hibernate  Solr,search,Ehcache 集成测试..");
        comments.setCtime(new Date());
        session.save(comments);
        
        Transaction transaction =session.beginTransaction();
        transaction.commit();
        
    }
    /**
     * �建立索引����
     * �
     */
    @Test
    public void createIndex(){
        FullTextSession fullTextSession = Search.getFullTextSession(session);  
        //
        List<Comments> comments = session.createCriteria(Comments.class).list();  
        session.beginTransaction();  
        //依次建立索引
        for (Iterator iterator = comments.iterator(); iterator.hasNext();) {  
            Comments comment = (Comments) iterator.next();  
            try {
                fullTextSession.createIndexer(Comments.class).startAndWait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }  
        session.getTransaction().commit();  
        System.out.println("index over......");
    }

    /**
     * 检索
     */
    @Test
    public void test2(){
        FullTextSession fullTextSession =Search.getFullTextSession(session);
        //利用支持中文的分词器
        QueryParser queryParser = new QueryParser
                //从指定的 域中查询
        (Version.LUCENE_31,"content",new CJKAnalyzer(Version.LUCENE_31));
     try {
         //要检索的内容
        org.apache.lucene.search.Query query=queryParser.parse("公平");
      FullTextQuery fullTextQuery=fullTextSession.createFullTextQuery
                               (query, Comments.class);
      List<Comments> lists = fullTextQuery.list();
      for(Comments comments:lists){
          System.out.println(comments);
      }
     } catch (ParseException e) {
        e.printStackTrace();
    }
    }
    @After
    public void after(){
        if(session!=null){
            session.close();
            System.out.println("session关闭...");
            
        }
        
    }
    
}

经测试检索可用。

遇到的异常:

 

 

posted @ 2015-09-24 16:04  snow__wolf  阅读(553)  评论(0)    收藏  举报