首页 > 代码库 > Hibernate-Search使用
Hibernate-Search使用
Hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="sessionFactory"> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hibernate_search</property> <property name="hibernate.connection.username">travis</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="hibernate.hbm2ddl.auto" value=http://www.mamicode.com/"update" /> >spring配置文件
<?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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <context:annotation-config /> <context:property-placeholder location="classpath:jdbc.properties" /> <context:component-scan base-package="org.hibernate.search.hibernate.example"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!-- 阿里 Druid数据源 --> <!-- https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 --> <bean id="hibernate4DataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="username" value=http://www.mamicode.com/"${username}">>
实体类Author
package org.hibernate.search.hibernate.example.model; import java.util.Set; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table; import org.codehaus.jackson.annotate.JsonIgnore; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.search.annotations.Analyze; import org.hibernate.search.annotations.ContainedIn; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.Store; @Entity @Table(catalog="hibernate_search",name="Author") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="org.hibernate.search.hibernate.example.model.Author") public class Author { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; @Field(index=Index.YES,analyze=Analyze.NO,store=Store.COMPRESS) private String name; @ManyToMany(fetch=FetchType.LAZY,mappedBy="authors"/*,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE}*/) @ContainedIn @Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="org.hibernate.search.hibernate.example.model.Book") @JsonIgnore private Set<Book> books; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Book> getBooks() { return books; } public void setBooks(Set<Book> books) { this.books = books; } public Author() { } public Author(String name) { super(); this.name = name; } }
Bookpackage org.hibernate.search.hibernate.example.model; import static org.hibernate.search.annotations.FieldCacheType.CLASS; import static org.hibernate.search.annotations.FieldCacheType.ID; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import net.paoding.analysis.analyzer.PaodingAnalyzer; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.search.annotations.Analyze; import org.hibernate.search.annotations.Analyzer; import org.hibernate.search.annotations.Boost; import org.hibernate.search.annotations.CacheFromIndex; import org.hibernate.search.annotations.DateBridge; import org.hibernate.search.annotations.DocumentId; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.IndexedEmbedded; import org.hibernate.search.annotations.Resolution; import org.hibernate.search.annotations.Store; @Entity @Table(catalog="hibernate_search",name="Book") @Indexed(index="book") //@Analyzer(impl=IKAnalyzer.class) @Analyzer(impl=PaodingAnalyzer.class) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="org.hibernate.search.hibernate.example.model.Book") @Boost(2.0f) @CacheFromIndex( { CLASS, ID } ) public class Book { @Id @GeneratedValue(strategy=GenerationType.AUTO) @DocumentId private Integer id; @Field(index = Index.YES, analyze = Analyze.YES, store = Store.COMPRESS) @Boost(1.5f) private String name; @Field(index = Index.YES, analyze = Analyze.YES, store = Store.COMPRESS) @Boost(1.2f) private String description; @Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES) @DateBridge(resolution = Resolution.DAY) private Date publicationDate; @IndexedEmbedded(depth=1) @ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE},fetch=FetchType.LAZY) @JoinTable( catalog="hibernate_search", name="Book_Author", joinColumns={@JoinColumn(name = "book_id")}, inverseJoinColumns = {@JoinColumn(name = "author_id")} ) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE,region="org.hibernate.search.hibernate.example.model.Author") private Set<Author> authors = new HashSet<Author>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getPublicationDate() { return publicationDate; } public void setPublicationDate(Date publicationDate) { this.publicationDate = publicationDate; } public Set<Author> getAuthors() { return authors; } public void setAuthors(Set<Author> authors) { this.authors = authors; } public Book() { } }
返回结果类package org.hibernate.search.hibernate.example.model; import java.util.List; /** * 查询结果集封装 * @author Administrator * * @param <T> */ public class QueryResult<T> { private int searchresultsize; List<T> searchresult; public int getSearchresultsize() { return searchresultsize; } public void setSearchresultsize(int searchresultsize) { this.searchresultsize = searchresultsize; } public List<T> getSearchresult() { return searchresult; } public void setSearchresult(List<T> searchresult) { this.searchresult = searchresult; } }Dao
package org.hibernate.search.hibernate.example.dao.impl; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.util.Version; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.hibernate.example.dao.BookDao; import org.hibernate.search.hibernate.example.model.Author; import org.hibernate.search.hibernate.example.model.Book; import org.hibernate.search.hibernate.example.model.QueryResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; @Repository(value=http://www.mamicode.com/"bookDaoImpl")>
IndexManager 建索引
package org.hibernate.search.hibernate.example; import org.hibernate.SessionFactory; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; /** * @author Administrator * */ public class IndexManger implements InitializingBean{ @Autowired @Qualifier("hibernate4sessionFactory") private SessionFactory sessionFactory; @Override public void afterPropertiesSet() throws Exception { //重建索引 FullTextSession fullTextSession = Search.getFullTextSession(sessionFactory.openSession()); fullTextSession.createIndexer().startAndWait(); } }
SearchManager 查询类package org.hibernate.search.hibernate.example; import java.util.List; import java.util.Set; import net.paoding.analysis.analyzer.PaodingAnalyzer; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.Query; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.util.Version; import org.hibernate.SessionFactory; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.hibernate.example.model.Author; import org.hibernate.search.hibernate.example.model.Book; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SearchManager { public static void main(String[] args) throws Exception{ ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); SessionFactory sessionFactory = applicationContext.getBean("hibernate4sessionFactory",SessionFactory.class); FullTextSession fullTextSession = Search.getFullTextSession(sessionFactory.openSession()); //使用Hibernate Search api查询 从多个字段匹配 name、description、authors.name // QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Book.class ).get(); // Query luceneQuery = qb.keyword().onFields("name","description","authors.name").matching("移动互联网").createQuery(); //使用lucene api查询 从多个字段匹配 name、description、authors.name //使用庖丁分词器 MultiFieldQueryParser queryParser=new MultiFieldQueryParser(Version.LUCENE_36, new String[]{"name","description","authors.name"}, new PaodingAnalyzer()); Query luceneQuery=queryParser.parse("实战"); FullTextQuery fullTextQuery =fullTextSession.createFullTextQuery(luceneQuery, Book.class); //设置每页显示多少条 fullTextQuery.setMaxResults(5); //设置当前页 fullTextQuery.setFirstResult(0); //高亮设置 SimpleHTMLFormatter formatter=new SimpleHTMLFormatter("<b><font color='red'>", "<font/></b>"); QueryScorer queryScorer=new QueryScorer(luceneQuery); Highlighter highlighter=new Highlighter(formatter, queryScorer); @SuppressWarnings("unchecked") List<Book> resultList = fullTextQuery.list(); System.out.println("共查找到["+resultList.size()+"]条记录"); for (Book book : resultList) { String highlighterString=null; Analyzer analyzer=new PaodingAnalyzer(); try { //高亮name highlighterString=highlighter.getBestFragment(analyzer, "name", book.getName()); if(highlighterString!=null){ book.setName(highlighterString); } //高亮authors.name Set<Author> authors = book.getAuthors(); for (Author author : authors) { highlighterString=highlighter.getBestFragment(analyzer, "authors.name", author.getName()); if(highlighterString!=null){ author.setName(highlighterString); } } //高亮description highlighterString=highlighter.getBestFragment(analyzer, "description", book.getDescription()); if(highlighterString!=null){ book.setDescription(highlighterString); } } catch (Exception e) { } System.out.println("书名:"+book.getName()+"\n描述:"+book.getDescription()+"\n出版日期:"+book.getPublicationDate()); System.out.println("----------------------------------------------------------"); } fullTextSession.close(); sessionFactory.close(); } }Hibernate-Search使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。