lucene 2.9 의 간단 한 사용
자 료 를 찾 아 데모, 실험 을 통 해 마침내 썼 다.
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";
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.