[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关闭..."); } } }
经测试检索可用。
遇到的异常:



浙公网安备 33010602011771号