Lucene2.0下面的索引和搜索(2006-11-08 09:17:21)
下面是lucene2.0的代码,使用后的感觉:性能方面明显要比1.4.3好。容错性更强了。
IndexerFile.java
SearcherFile.java
package photoblog.search;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
public class IndexerFile {
public static int
indexFile(String indexDir,PhotoSearcher[] list) throws
IOException{
File segments = new
File(indexDir + File.separator +PhotoStatic.SEGMENTS);
int wc = 0;
while (wc < 10 &&
IndexReader.isLocked(indexDir)) {
try {
Thread.sleep(100);
} catch
(InterruptedException e) {
return
0;
}
wc++;
}
boolean bCreate =
!segments.exists();
System.out.println("bCreate==="+bCreate);
IndexWriter writer=new IndexWriter(indexDir,new
StandardAnalyzer(),bCreate);
writer.setUseCompoundFile(false);
for(int
i=0;i<list.length;i++){
Document
doc=new Document();
doc.add(new
Field(PhotoStatic.PHOTOID, String.valueOf(list[i].getPhotoId()),
Field.Store.YES, Field.Index.NO));
if(list[i].getTitle()!=null)
doc.add(new
Field(PhotoStatic.TITLE, list[i].getTitle(), Field.Store.YES,
Field.Index.TOKENIZED));
if(list[i].getDescription()!=null)
doc.add(new
Field(PhotoStatic.DESCRIPTION, list[i].getDescription(),
Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new
Field(PhotoStatic.ADDRESS, list[i].getAddress(), Field.Store.YES,
Field.Index.NO));
doc.add(new
Field(PhotoStatic.USERNAME, list[i].getUserName(), Field.Store.YES,
Field.Index.TOKENIZED));
if(list[i].getPenName()!=null)
doc.add(new
Field(PhotoStatic.PENNAME, list[i].getPenName(), Field.Store.YES,
Field.Index.TOKENIZED));
doc.add(new
Field(PhotoStatic.USERID, String.valueOf(list[i].getUserId()),
Field.Store.YES, Field.Index.NO));
if(list[i].getTag().length()>0)
doc.add(new
Field(PhotoStatic.TAG, list[i].getTag(), Field.Store.YES,
Field.Index.TOKENIZED));
if(list[i].getComment()!=null)
doc.add(new
Field(PhotoStatic.COMMENT, list[i].getComment(), Field.Store.YES,
Field.Index.TOKENIZED));
if(list[i].getMake()!=null)
doc.add(new
Field(PhotoStatic.MAKE, list[i].getMake(), Field.Store.YES,
Field.Index.TOKENIZED));
if(list[i].getModel()!=null){
String
str =list[i].getModel().replaceAll(" ","");
doc.add(new
Field(PhotoStatic.MODEL, str, Field.Store.YES,
Field.Index.TOKENIZED));
}
writer.addDocument(doc);
}
int
numIndexed=writer.docCount();
writer.optimize();
writer.close();
return numIndexed;
}
}
package photoblog.search;
import java.io.IOException;
import java.util.Vector;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import photoblog.javabean.Photo;
public class SearcherFile {
public static PhotoSearcher[] search(Searcher
searcher, String q,int pageNo,int pageSize) throws IOException,
ParseException {
Analyzer analyzer = new
StandardAnalyzer();
String[] fields = {
PhotoStatic.TITLE,PhotoStatic.DESCRIPTION,PhotoStatic.TAG,PhotoStatic.USERNAME,PhotoStatic.PENNAME,PhotoStatic.COMMENT,PhotoStatic.MAKE,PhotoStatic.MODEL};
MultiFieldQueryParser mq=new
MultiFieldQueryParser(fields,analyzer);
Query query=mq.parse(q);
//Query query=mq.Query(q);
//1.4.3
//Query query =
MultiFieldQueryParser.parse(q, fields, analyzer);
Hits hits =
searcher.search(query);
int start=(pageNo-1)*pageSize;
int end=pageNo*pageSize;
if(end>hits.length())end=hits.length();
Vector v =new Vector();
for(int
i=start;i<end;i++){
PhotoSearcher
ps=new PhotoSearcher();
Document
doc=hits.doc(i);
ps.setPhotoId(Long.parseLong(doc.get(PhotoStatic.PHOTOID)));
ps.setTitle(doc.get(PhotoStatic.TITLE));
ps.setUserName(doc.get(PhotoStatic.USERNAME));
ps.setUserId(Long.parseLong(doc.get(PhotoStatic.USERID)));
ps.setAddress(doc.get(PhotoStatic.ADDRESS));
v.addElement(ps);
}
return
(PhotoSearcher[])v.toArray(new PhotoSearcher[v.size()]);
}
public static int
searchNum(Searcher searcher, String q) throws IOException,
ParseException {
Analyzer analyzer = new
StandardAnalyzer();
String[] fields = {
PhotoStatic.TITLE,PhotoStatic.DESCRIPTION,PhotoStatic.TAG,PhotoStatic.USERNAME,PhotoStatic.PENNAME,PhotoStatic.COMMENT,PhotoStatic.MAKE,PhotoStatic.MODEL};
MultiFieldQueryParser mq=new
MultiFieldQueryParser(fields,analyzer);
Query query=mq.parse(q);
//Query
query=mq.Query(q);
//Query query =
MultiFieldQueryParser.parse(q, fields, analyzer);
Hits hits =
searcher.search(query);
return hits.length();
}
/*
* 搜索一种类型的图片
*/
public static Photo[] searchOne(Searcher
searcher, String q,int pageNo,int pageSize,String type) throws
IOException, ParseException {
Analyzer analyzer = new
StandardAnalyzer();
QueryParser qp=new
QueryParser(type,analyzer);
Query query =
qp.parse(q);
Hits hits =
searcher.search(query);
int start=(pageNo-1)*pageSize;
int end=pageNo*pageSize;
if(end>hits.length())end=hits.length();
Vector v =new Vector();
for(int
i=hits.length()-start-1;i>=hits.length()-end;i--){
Photo ps=new
Photo();
Document
doc=hits.doc(i);
ps.setId(Long.parseLong(doc.get(PhotoStatic.PHOTOID)));
ps.setTitle(doc.get(PhotoStatic.TITLE));
ps.setUserName(doc.get(PhotoStatic.USERNAME));
ps.setUserID(Long.parseLong(doc.get(PhotoStatic.USERID)));
ps.setAddress(doc.get(PhotoStatic.ADDRESS));
v.addElement(ps);
}
return (Photo[])v.toArray(new
Photo[v.size()]);
}
/*
* 搜索一种类型的图片的图片数
*/
public static int
searchOneNum(Searcher searcher, String q,String type) throws
IOException, ParseException {
Analyzer analyzer = new
StandardAnalyzer();
//Query query =
QueryParser.parse(q, type, analyzer);
QueryParser qp=new
QueryParser(type,analyzer);
Query query =
qp.parse(q);
Hits hits =
searcher.search(query);
return hits.length();
}
}