아파치 루신은 자바 기반의 오픈 소스 검색 엔진 라이브러리로, 다양한 언어에서 효과적인 텍스트 검색을 구현할 수 있습니다. 이 글에서는 아파치 루신을 활용하여 정교한 일치 검색을 어떻게 구현할 수 있는지 알아보겠습니다.
1. 루신 설정
아파치 루신을 사용하기 위해서는 먼저 루신을 설치하고 설정해야 합니다. 설치는 아파치 루신의 공식 홈페이지에서 다운로드할 수 있으며, 설정은 lucene-config.xml
파일을 수정하여 진행할 수 있습니다. 설정 파일에서는 검색 필드, 분석기 및 색인 설정 등을 정의할 수 있습니다.
2. 색인 생성
루신에서는 검색을 위해 먼저 색인을 생성해야 합니다. 색인은 검색 대상 문서들을 분석하여 효율적인 검색을 위한 데이터 구조를 생성하는 과정입니다. 색인 생성은 아파치 루신의 IndexWriter
클래스를 사용하여 수행할 수 있습니다.
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.ko.KoreanAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
public void createIndex() throws IOException {
// 색인 디렉토리 설정
Directory indexDir = FSDirectory.open(Paths.get("index"));
// 분석기 설정
Analyzer analyzer = new KoreanAnalyzer();
// IndexWriter 설정
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(indexDir, config);
// 검색 대상 문서 추가
Document doc1 = new Document();
doc1.add(new TextField("content", "루신은 강력한 검색 엔진이다.", Field.Store.YES));
// 색인 생성
writer.addDocument(doc1);
writer.close();
}
위 코드에서는 한글 문서를 색인하기 위해 KoreanAnalyzer
를 사용하였습니다. TextField
를 사용하여 색인할 필드를 정의하고, IndexWriter
를 사용하여 문서를 색인에 추가합니다.
3. 검색 수행
색인 생성 후에는 사용자의 검색 쿼리에 해당하는 문서를 검색하는 과정을 거쳐야 합니다. 아파치 루신에서는 IndexSearcher
클래스를 사용하여 검색을 수행할 수 있습니다.
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.ko.KoreanAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.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.Directory;
import org.apache.lucene.store.FSDirectory;
public List<String> search(String queryStr) throws IOException, ParseException {
// 색인 디렉토리 설정
Directory indexDir = FSDirectory.open(Paths.get("index"));
// 분석기 설정
Analyzer analyzer = new KoreanAnalyzer();
// 검색어 파서 설정
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse(queryStr);
// IndexReader 설정
IndexReader reader = DirectoryReader.open(indexDir);
// IndexSearcher 설정
IndexSearcher searcher = new IndexSearcher(reader);
// 검색 수행
TopDocs topDocs = searcher.search(query, 10);
ScoreDoc[] hits = topDocs.scoreDocs;
// 검색 결과 반환
List<String> results = new ArrayList<>();
for (ScoreDoc hit : hits) {
Document doc = searcher.doc(hit.doc);
results.add(doc.get("content"));
}
reader.close();
return results;
}
위 코드에서는 검색어를 파싱하기 위해 QueryParser
를 사용하였습니다. 검색 결과에 해당하는 문서를 가져오기 위해 IndexSearcher
를 사용하고, scoreDocs
를 통해 검색 결과를 순회합니다.
결론
이렇게 아파치 루신을 활용하여 정교한 일치 검색을 구현할 수 있습니다. 루신은 다양한 언어를 지원하며, 분석기를 사용하여 검색 쿼리를 정교하게 처리할 수 있습니다. 만약 대용량 데이터베이스에서의 검색이 필요하다면, 아파치 루신은 강력한 검색 엔진 라이브러리로서 매우 유용할 것입니다.