Lucene 기본 응용 사례
1. 지정한 데이터 테이블의 인덱스 만들기
indexDirPath는 색인 파일의 저장 경로입니다.clearDir는 색인을 만들 때마다 폴더를 비울 지 여부를 가리킨다.batch Indexing Dao는 데이터를 추출하기 위한 DAO 인터페이스로 공공
/**
* Creates index. This is generic method for creating index.
*
* @param <T> the object type which will be indexed.
* @param indexFileDir the index file's directory.
* @param clearDir whether clear the direcory first when creating index.
* @param batchIndexingDao the batch indexing dao, it's used to load objects from database when indexing.
* @param tableName the table name. there are many topic and reply daily tables.
* @param indexDocWrapper the wrapper to wrap an object into document.
*/
public <T> void createIndex(String indexDirPath, boolean clearDir, BatchIndexingDao batchIndexingDao ,String tableName , IndexDocWrapper<T> indexDocWrapper){
IndexWriter writer = null;
try {
File indexFileDir = new File(indexDirPath);
if(indexFileDir.exists()&&clearDir==true){
FileUtils.cleanDirectory(indexFileDir);
logger.info("The specified direcory:" + indexDirPath +" has cleared.");
}
writer = new IndexWriter(FSDirectory.open(indexFileDir), new IKAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
writer.setRAMBufferSizeMB(Constants.INDEX_WRITER_RAM_BUFFER);
int recordIndex = 0;
List<T> objects = null;
do {
try {
objects = batchIndexingDao.getBatchRecords(tableName, recordIndex, Constants.BATCH_INDEX_SIZE);
} catch (BadSqlGrammarException e) {
logger.error(tableName+" does not exist!");
continue;
}
if (objects != null && !objects.isEmpty()) {
for (T object : objects) {
writer.addDocument(indexDocWrapper.createDoc(object));
}
logger.info(recordIndex + objects.size() + " records has added!");
recordIndex += Constants.BATCH_INDEX_SIZE;
}
} while (objects != null && !objects.isEmpty());
logger.info("Starts to optimize...");
writer.optimize();
logger.info("Optimize finished.");
} catch (CorruptIndexException e) {
logger.error(e.getMessage());
e.printStackTrace();
} catch (LockObtainFailedException e) {
logger.error(e.getMessage());
e.printStackTrace();
} catch (IOException e) {
logger.error(e.getMessage());
e.printStackTrace();
} finally {
if(writer!=null){
try {
writer.close();
logger.info("Topic indexing work finished.");
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2. 주어진 키워드에 따라 적중한 대상을 검색한다
indexDirPath는 색인 파일의 저장 경로입니다.field 는 검색되는 Lucene Document 의 field 입니다.expression은 lucene 표현식입니다.indexObjectWrapper와 indexDocWrapper는 대응합니다. 루틴의 Document를 추출하여 대상에 봉인한 소포기입니다.beginIndex와count는 검색 결과가 많을 때 페이지를 나누는 데 사용됩니다.
/**
* Search. This is generic method for searching with paging.
*
* @param <T> the searching target object type.
* @param indexFileDir the index file dir
* @param field the document field for searching.
* @param expression the expression
* @param indexObjectWrapper the index object wrapper
* @param beginIndex the begin index
* @param count the count
* @return the list
*/
public <T> List<T> search(String indexFileDir, String field, String expression, IndexObjectWrapper<T> indexObjectWrapper, int beginIndex, int count){
IndexSearcher indexSearcher = null;
try {
logger.info("Starts to search...");
if(expression==null||"".equals(expression.trim())){
throw new NullPointerException("The lucene expression is null or empty!");
}
indexSearcher = new IndexSearcher(FSDirectory.open(new File(indexFileDir)));
Query query = new QueryParser(Version.LUCENE_CURRENT, field, new IKAnalyzer()).parse(expression);
TopDocs topDocs = indexSearcher.search(query, Integer.MAX_VALUE);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
logger.info("Total Hits: "+topDocs.totalHits);
List<T> objects = new ArrayList<T>();
int endIndex = beginIndex+count;
for (int i = beginIndex; i < endIndex; i++) {
Document targetDoc = indexSearcher.doc(scoreDocs[i].doc);
objects.add(indexObjectWrapper.createObject(targetDoc));
}
return objects;
} catch (Exception e) {
logger.info(e.getMessage());
e.printStackTrace();
return null;
} finally {
if(indexSearcher!=null){
try {
indexSearcher.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring에서 DAO가 순환 호출될 때 데이터가 실시간으로 업데이트되지 않는 해결 방법문제를 설명하기 전에 몇 가지 전제 사항을 설명하십시오. Spring의 구성 파일에서 다음과 같은 방식으로 데이터베이스 트랜잭션을 구성했다고 가정하십시오. 현재 UserDao 및 Security Service가 있습...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.