TEAM : I.S.T.O
AUTHOR : Jerry
实体类
package search.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
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;
@Entity
@Table(name="song")
@Indexed(index="song")
@NamedQueries({
@NamedQuery(name="Song.list[find]",query="from Song s order by s.time desc"),
@NamedQuery(name="Song.list[count]",query="select count(*) from Song"),
@NamedQuery(name="Song.byCityId[load]",query="from Song s where s.artistCityId =?")
})
public class Song implements Serializable{
private static final long serialVersionUID = -1475639504643543299L;
@Id
@DocumentId
@GeneratedValue(generator="system_uuid")
@GenericGenerator(name="system_uuid",strategy="uuid")
private String id;
@Column(name="artist",length=36)
private String artist;
@Column(name="name",length=36,nullable=false)
@Field(index=Index.TOKENIZED,store=Store.NO)
private String name;
@Lob
@Column(name="lyric",length=2000)
@Field(index=Index.TOKENIZED,store=Store.NO)
private String lyric;
@Column(name="time",nullable=false)
@Field(index=Index.UN_TOKENIZED,store=Store.NO)
private Date time;
@Column(name="artistCityId",nullable=false)
@Field(index=Index.UN_TOKENIZED,store=Store.YES)
private Integer artistCityId;
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLyric() {
return lyric;
}
public void setLyric(String lyric) {
this.lyric = lyric;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id=id;
}
public Integer getArtistCityId() {
return artistCityId;
}
public void setArtistCityId(Integer artistCityId) {
this.artistCityId = artistCityId;
}
}
测试类
package search.test;
import java.util.Date;
import java.util.List;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import search.entity.Song;
import search.util.HibernateSessionFactory;
public class IndexTest {
private Session session;
@Before
public void before(){
session=HibernateSessionFactory.getSession();
}
@Test
public void insert(){
Transaction tx=session.beginTransaction();
try {
for(int i=0;i<1000;i++){
Song song=new Song();
song.setArtist("群星");
song.setName("北京欢迎你");
song.setLyric("北京欢迎你,welcome to beijing,第29届奥林匹克运动会");
song.setTime(new Date());
song.setArtistCityId(i%8);
session.save(song);
if(i%1000==0)session.flush();
}
// throw new RuntimeException("error");
} catch (Exception e) {
tx.rollback();
}
tx.commit();
}
@Test
public void delete(){
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
List<Song> songs = session.getNamedQuery("Song.byCityId[load]").setInteger(0, 1).list();
for (Song song : songs) {
session.delete(song);
}
tx.commit();
}
@Test
public void index(){
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
List<Song> songs = session.getNamedQuery("Song.list[find]").list();
for (Song song : songs) {
fullTextSession.index(song);
}
tx.commit();
}
@Test
public void search() throws ParseException{
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
BooleanQuery booleanQuery=new BooleanQuery();
MultiFieldQueryParser parser = new MultiFieldQueryParser( new String[]{"name", "lyric"},
new PaodingAnalyzer());
Query query = parser.parse( "北京欢迎你" );
booleanQuery.add(query,BooleanClause.Occur.MUST);
TermQuery tq=new TermQuery(new Term("artistCityId","0"));
booleanQuery.add(tq,BooleanClause.Occur.MUST);
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( booleanQuery, Song.class );
List<Song> songs = hibQuery.list();
// for(Song song:songs){
// System.out.println(song.getArtist()+":"+song.getName()+":"+song.getLyric());
// }
System.out.println("count:"+songs.size());
tx.commit();
}
@Test
public void purgeAll(){
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
fullTextSession.purgeAll( Song.class );
tx.commit();
fullTextSession.getSearchFactory().optimize(Song.class);
fullTextSession.getSearchFactory().optimize();
}
@After
public void close(){
HibernateSessionFactory.closeSession();
}
}
此上代码全部拷贝即可正常使用。
AUTHOR : Jerry
实体类
package search.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
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;
@Entity
@Table(name="song")
@Indexed(index="song")
@NamedQueries({
@NamedQuery(name="Song.list[find]",query="from Song s order by s.time desc"),
@NamedQuery(name="Song.list[count]",query="select count(*) from Song"),
@NamedQuery(name="Song.byCityId[load]",query="from Song s where s.artistCityId =?")
})
public class Song implements Serializable{
private static final long serialVersionUID = -1475639504643543299L;
@Id
@DocumentId
@GeneratedValue(generator="system_uuid")
@GenericGenerator(name="system_uuid",strategy="uuid")
private String id;
@Column(name="artist",length=36)
private String artist;
@Column(name="name",length=36,nullable=false)
@Field(index=Index.TOKENIZED,store=Store.NO)
private String name;
@Lob
@Column(name="lyric",length=2000)
@Field(index=Index.TOKENIZED,store=Store.NO)
private String lyric;
@Column(name="time",nullable=false)
@Field(index=Index.UN_TOKENIZED,store=Store.NO)
private Date time;
@Column(name="artistCityId",nullable=false)
@Field(index=Index.UN_TOKENIZED,store=Store.YES)
private Integer artistCityId;
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLyric() {
return lyric;
}
public void setLyric(String lyric) {
this.lyric = lyric;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id=id;
}
public Integer getArtistCityId() {
return artistCityId;
}
public void setArtistCityId(Integer artistCityId) {
this.artistCityId = artistCityId;
}
}
测试类
package search.test;
import java.util.Date;
import java.util.List;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import search.entity.Song;
import search.util.HibernateSessionFactory;
public class IndexTest {
private Session session;
@Before
public void before(){
session=HibernateSessionFactory.getSession();
}
@Test
public void insert(){
Transaction tx=session.beginTransaction();
try {
for(int i=0;i<1000;i++){
Song song=new Song();
song.setArtist("群星");
song.setName("北京欢迎你");
song.setLyric("北京欢迎你,welcome to beijing,第29届奥林匹克运动会");
song.setTime(new Date());
song.setArtistCityId(i%8);
session.save(song);
if(i%1000==0)session.flush();
}
// throw new RuntimeException("error");
} catch (Exception e) {
tx.rollback();
}
tx.commit();
}
@Test
public void delete(){
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
List<Song> songs = session.getNamedQuery("Song.byCityId[load]").setInteger(0, 1).list();
for (Song song : songs) {
session.delete(song);
}
tx.commit();
}
@Test
public void index(){
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
List<Song> songs = session.getNamedQuery("Song.list[find]").list();
for (Song song : songs) {
fullTextSession.index(song);
}
tx.commit();
}
@Test
public void search() throws ParseException{
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
BooleanQuery booleanQuery=new BooleanQuery();
MultiFieldQueryParser parser = new MultiFieldQueryParser( new String[]{"name", "lyric"},
new PaodingAnalyzer());
Query query = parser.parse( "北京欢迎你" );
booleanQuery.add(query,BooleanClause.Occur.MUST);
TermQuery tq=new TermQuery(new Term("artistCityId","0"));
booleanQuery.add(tq,BooleanClause.Occur.MUST);
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery( booleanQuery, Song.class );
List<Song> songs = hibQuery.list();
// for(Song song:songs){
// System.out.println(song.getArtist()+":"+song.getName()+":"+song.getLyric());
// }
System.out.println("count:"+songs.size());
tx.commit();
}
@Test
public void purgeAll(){
FullTextSession fullTextSession = Search.createFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();
fullTextSession.purgeAll( Song.class );
tx.commit();
fullTextSession.getSearchFactory().optimize(Song.class);
fullTextSession.getSearchFactory().optimize();
}
@After
public void close(){
HibernateSessionFactory.closeSession();
}
}
此上代码全部拷贝即可正常使用。