http://blog.sina.com.cn/huangjunhua[订阅]
字体大小: 正文
Lucene2.0下面的索引和搜索(2006-11-08 09:17:21)
这篇文章主要和前面这篇文章(http://blog.sina.com.cn/u/4964dd65010006y3)对比,把图博的搜索从lucene 1.4.3换成了lucene 2.0.
下面是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();
 }
}

 
  • 评论加载中,请稍候...
发评论    明星私家相册

验证码:看不清楚数字吗?点击这里再试试。收听验证码

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

相关博文
读取中...
推荐博文
读取中...