hibernate search 本身底层运用lucene技术。下载最新hibernate-search-3.2.0.Final-dist.zip把里面的包全导入classpath中。
在加入一些依赖包:如javassist.jar,login4jar版本要高一点的,slf4j-log4j12-1.5.2.jar等等
基本的东西有了
首先在hibernate.hbm.xml中配置
<!-- use a file system based index -->
<property name="hibernate.search.default.directory_provider">
org.hibernate.search.store.FSDirectoryProvider
</property>
<!-- directory where the indexes will be stored -->
<property name="hibernate.search.default.indexBase" >
D:/tmp/index
</property>
<!--配置文件-->
<mapping resource="com/zz/Zz.hbm.xml" />
<event type="post-update">
<listener class="org.hibernate.search.event.FullTextIndexEventListener" />
</event>
<event type="post-insert">
<listener class="org.hibernate.search.event.FullTextIndexEventListener" />
</event>
<event type="post-delete">
<listener class="org.hibernate.search.event.FullTextIndexEventListener" />
</event>
接着建立
在pojo类中加入注解
如:import java.io.Serializable;
import org.hibernate.search.annotations.Analyzer;
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.Store;
@Indexed
public class Zz implements Serializable{
private static final long serialVersionUID = 1L;
public int id;
public String name;
public String password;
@DocumentId
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Field(store=Store.YES)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Field(store=Store.YES,index=Index.UN_TOKENIZED)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在后:
index让hibernate把索引 到 D:/tmp/index
public void index(){
Configuration config = new Configuration().configure();
SessionFactory sf = config.buildSessionFactory();
Session session = sf.openSession();
FullTextSession fts = Search.getFullTextSession(session);
fts.getTransaction().begin();
List<Zz> list = session.createQuery("from Zz").list();
for(Zz z:list){
fts.index(z);
}
fts.getTransaction().commit();
}
表写find();
public void find(){
Query luncene=null;
QueryParser parse = new QueryParser("title",new StandardAnalyzer());
try {
luncene = parse.parse("name:中国");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Configuration config = new Configuration().configure();
SessionFactory sf = config.buildSessionFactory();
Session session = sf.getCurrentSession();
FullTextSession fts = Search.getFullTextSession(session);
fts.getTransaction().begin();
org.hibernate.Query query = fts.createFullTextQuery(luncene, Zz.class);
query.setFirstResult(0);
query.setMaxResults(8);
List<Zz> list = query.list();
for(Zz z:list){
System.out.println("id:"+z.getId()+"name:"+z.getName());
}
fts.getTransaction().commit();
}
先调用index()后在调用find()方法。
这就是运用了hibernate search!效率高一些!对中文支持不是太好!