hibernate-search-5.1.1简易使用
系统要求java7和hibernate-core-4.3.8,此外还依赖如下jar包
使用demo如下:
package com.ciaos.controller; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.hibernate.Transaction; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.query.dsl.QueryBuilder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.ciaos.dao.Account; import com.ciaos.dao.HibernateSessionFactory; @Controller public class SearchController { //索引 @RequestMapping(value="/index", method={RequestMethod.GET}) public void index(HttpServletRequest req, HttpServletResponse resp){ try { FullTextSession fullTextSession = Search.getFullTextSession(HibernateSessionFactory.getSession()); try { fullTextSession.createIndexer().startAndWait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } PrintWriter out = resp.getWriter(); out.print("Done"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //搜索 @RequestMapping(value="/search", method={RequestMethod.POST,RequestMethod.GET}) public void search(HttpServletRequest req, HttpServletResponse resp){ try { String keyword = req.getParameter("keyword"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html; charset=utf-8"); PrintWriter out = resp.getWriter(); FullTextSession fullTextSession = Search.getFullTextSession(HibernateSessionFactory.getSession()); Transaction tx = fullTextSession.beginTransaction(); // create native Lucene query using the query DSL // alternatively you can write the Lucene query using the Lucene query parser // or the Lucene programmatic API. The Hibernate Search DSL is recommended though QueryBuilder qb = fullTextSession.getSearchFactory() .buildQueryBuilder().forEntity(Account.class).get(); org.apache.lucene.search.Query query = qb .keyword() .onFields("name") .matching(keyword) .createQuery(); // wrap Lucene query in a org.hibernate.Query org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(query, Account.class); // execute search List result = hibQuery.list(); tx.commit(); System.out.println(keyword); for(int i = 0;i < result.size();i++){ Account account = (Account) result.get(i); out.print("Result " + keyword + " " + account.getName()); } out.print("Search Done"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
POJO文件增加Field注解如下
package com.ciaos.dao; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import static javax.persistence.GenerationType.IDENTITY; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.search.annotations.Analyze; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.Store; /** * Account entity. @author MyEclipse Persistence Tools */ @Entity @Table(name = "account", catalog = "test") @Indexed(index="account") public class Account implements java.io.Serializable { // Fields private Integer id; private String name; // Constructors /** default constructor */ public Account() { } /** full constructor */ public Account(String name) { this.name = name; } // Property accessors @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } @Column(name = "name") @Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO) public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
配置文件
applicationContext.xml(hibernate4放弃CacheProvider,所以不能用org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml"> </property> </bean> </beans>
hibernate.cfg.xml,property增加如下配置
<property name="hibernate.search.default.directory_provider">org.hibernate.search.store.impl.FSDirectoryProvider</property> <property name="hibernate.search.default.indexBase">e:\test</property>