[java] 아파치 루신(Apache Lucene)을 활용한 정교한 일치 검색 구현 방법

아파치 루신은 자바 기반의 오픈 소스 검색 엔진 라이브러리로, 다양한 언어에서 효과적인 텍스트 검색을 구현할 수 있습니다. 이 글에서는 아파치 루신을 활용하여 정교한 일치 검색을 어떻게 구현할 수 있는지 알아보겠습니다.

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를 통해 검색 결과를 순회합니다.

결론

이렇게 아파치 루신을 활용하여 정교한 일치 검색을 구현할 수 있습니다. 루신은 다양한 언어를 지원하며, 분석기를 사용하여 검색 쿼리를 정교하게 처리할 수 있습니다. 만약 대용량 데이터베이스에서의 검색이 필요하다면, 아파치 루신은 강력한 검색 엔진 라이브러리로서 매우 유용할 것입니다.

참고 자료