lucene 2.9 의 간단 한 사용

9382 단어 자바apache.F#Lucene
프로젝트 는 매우 복잡 하 게 만 들 었 고 lucene 으로 특정 파일 의 내용 을 검색 하여 특정 어 휘 를 검사 했다.
자 료 를 찾 아 데모, 실험 을 통 해 마침내 썼 다.
ps: 인터넷 에 있 는 자 료 는 대부분 늙 었 어 요.
 
색인 만 들 기
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.wltea.analyzer.lucene.IKAnalyzer;
import vrvclient.util.ConfigUtil;
import vrvclient.util.FileListUtil;

/**
 *
 * @author lan
 */
public class Indexer extends Constants {

    private static final Log log = LogFactory.getLog(Indexer.class);

    public void index(File[] files, FileFilter filter) {
        if (files == null) {
            return;
        }
//        System.out.println(filter.getClass());
        Set<File> set = new HashSet<File>();
        for (File f : files) {//          ,   ,    
            FileListUtil.list(f, filter, set);
        }
        File indexDir = new File(ConfigUtil.getIndexPath());//               
        Analyzer analyzer = new IKAnalyzer();//     IK   ,     
        try {
            FSDirectory dir = FSDirectory.open(indexDir);//      
            IndexWriter iw = new IndexWriter(dir, analyzer, !IndexReader.indexExists(dir), IndexWriter.MaxFieldLength.LIMITED);
            for (File f : set) {
                if (f.isFile()) {
//                    System.out.println(f.getAbsolutePath());
                    Document doc = new Document();
                    Reader reader = new FileReader(f);
                    doc.add(new Field(PATH, f.getAbsolutePath(), Field.Store.YES, Field.Index.ANALYZED));//    
                    doc.add(new Field(FILE, reader));//    
                    iw.addDocument(doc);
                    reader.close();
                }
            }
            iw.optimize();
            iw.close();
        } catch (CorruptIndexException ex) {
            log.error(ex.getMessage(), ex);
        } catch (LockObtainFailedException ex) {
            log.error(ex.getMessage(), ex);
        } catch (IOException ex) {
            log.error(ex.getMessage(), ex);
        }
    }
}
 
이게 검색 결과 예요.
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;
import vrvclient.util.ConfigUtil;

/**
 *
 * @author lan
 */
public class Searcher extends Constants {

    private static final Log log = LogFactory.getLog(Indexer.class);

    /**
     *
     * @param contents
     * @param combineMode true = and,false = or
     * @param limit -1=all
     */
    public Set<String> search(String[] contents, boolean combineMode, int limit) {
        Set<String> paths = new HashSet<String>();
        try {
            File indexDir = new File(ConfigUtil.getIndexPath());
            FSDirectory fsd = FSDirectory.open(indexDir);
            IndexSearcher is = new IndexSearcher(fsd, true);
            Analyzer analyzer = new IKAnalyzer();
            if (fsd.getFile().exists()) {
                QueryParser qp = new QueryParser(FILE, analyzer);
                StringBuilder sb = new StringBuilder();
                String jioner = "";
                if (combineMode) {//   and,          
                    jioner = "+";
                }
                boolean b = true;
                for (String s : contents) {
                    s = s.replaceAll("\\s+", " AND ");//           “ ”,    “ ”
                    if (!b) {
                        sb.append(" ");
                    }
                    sb.append(jioner).append("(").append(s).append(")");
                    b = false;
                }
                Query q = qp.parse(sb.toString());
                log.info(q.toString());
                if (limit == -1) {
                    limit = is.maxDoc();
                }

                TopDocs hits = is.search(q, limit);
                ScoreDoc[] sds = hits.scoreDocs;
                for (int i = 0; i < sds.length; i++) {
                    ScoreDoc sd = sds[i];
                    Document doc = is.doc(sd.doc);
//                    System.out.println("Hit:(" + sd.score + ")" + doc.toString());
//           ,     ,             ,     。
                    paths.add(doc.get(PATH));//       
                }
            }
            is.close();
        } catch (ParseException ex) {
            log.error(ex.getMessage(), ex);
        } catch (IOException ex) {
            log.error(ex.getMessage(), ex);
        }
        return paths;
    }
}

 
첨부 된 도구 종류:
import java.io.File;
import java.io.FileFilter;
import java.util.Map;
import java.util.Set;

/**
 *
 * @author lan
 */
public final class FileListUtil {

//              
    public static void list(File f, FileFilter filter, Set<File> set, int limit) {
        if (limit > -1 && set.size() >= limit) {
            return;
        }
        if (f == null) {
            return;
        }
        if (f.isFile()) {
            set.add(f);
        } else if (f.isDirectory()) {
            File[] files = null;
            if (filter == null) {
                files = f.listFiles();
            } else {
                files = f.listFiles(filter);
            }
            if (files != null) {
                for (File file : files) {
                    list(file, filter, set, limit);
                }
            }
        }
    }

//            ,    set   ,    D               
    public static void list(File f, FileFilter filter, Set<File> set) {
        if (f == null) {
            return;
        }
        if (f.isFile()) {
            set.add(f);
        } else if (f.isDirectory()) {
            File[] files = null;
            if (filter == null) {
                files = f.listFiles();
            } else {
                files = f.listFiles(filter);
            }
            if (files != null) {
                for (File file : files) {
                    list(file, filter, set);
                }
            }
        }
    }

//           
    public static void list(File f, FileFilter filter, String parent, Map<String, File> map) {
        if (f == null) {
            return;
        }
        String name = f.getName();
        if (parent != null) {
            name = parent + "/" + name;
        }
        if (f.isFile()) {
            map.put(name, f);
        } else if (f.isDirectory()) {
            File[] files = null;
            if (filter == null) {
                files = f.listFiles();
            } else {
                files = f.listFiles(filter);
            }
            if (files != null) {
                for (File file : files) {
                    list(file, filter, name, map);
                }
            }
        }
    }
}

 
상수 류 는 대부분 인 터 페 이 스 를 사용 하지만 저 는 인터페이스 로 상수 를 저장 하 는 것 을 좋아 하지 않 습 니 다. 더 편리 하지만 규범 에 맞지 않 습 니 다.
public class Constants {//       ,    

    protected static final String PATH = "path";
    protected static final String FILE = "file";
}
 

좋은 웹페이지 즐겨찾기