[java] 아파치 루신(Apache Lucene)을 이용한 한글 검색 처리 방법

아파치 루신(Apache Lucene)은 자바 기반의 오픈 소스 검색 엔진 라이브러리로, 텍스트 검색을 위한 강력한 기능을 제공합니다. 하지만 기본적으로 영어를 대상으로 설계되어 있기 때문에 한글을 검색하기 위해서는 몇 가지 추가 작업이 필요합니다.

1. 한글 형태소 분석기 설정

한글을 검색하기 위해서는 한글 형태소 분석기를 사용해야 합니다. 형태소 분석기는 문장을 형태소 단위로 분리하여 검색에 활용할 단어를 추출하는 역할을 합니다.

Lucene에서는 한글 형태소 분석기로 “Lucene-Korean-Analyzer”를 사용할 수 있습니다. 이를 Maven을 사용하여 프로젝트에 추가하도록 하겠습니다.

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-korean-analyzer</artifactId>
    <version>latest-version</version>
</dependency>

위의 코드는 Maven 프로젝트에서 “Lucene-Korean-Analyzer”를 사용하기 위한 의존성을 추가하는 코드입니다. ${latest-version}은 현재 사용 가능한 최신 버전으로 변경되어야 합니다.

2. 필드 정의

한글 검색을 위해 적절한 필드를 정의해야 합니다. 보통 TextFieldStringField를 사용하며, 해당 필드에는 형태소 분석기를 지정해야 합니다.

Analyzer analyzer = new KoreanAnalyzer();

IndexWriterConfig config = new IndexWriterConfig(analyzer);

IndexWriter writer = new IndexWriter(indexDir, config);

위의 코드에서 analyzer 변수에 한글 형태소 분석기를 생성하여 할당하고, 해당 analyzerIndexWriterConfig에 설정합니다. 이후 IndexWriter를 생성할 때 이 config를 사용합니다.

3. Indexing 및 Searching

한글 텍스트를 인덱싱하고 검색을 할 때에도 같은 분석기를 적용해야 합니다.

Document doc = new Document();
doc.add(new TextField("content", "한글텍스트", Field.Store.YES));
writer.addDocument(doc);

위의 코드에서 TextField의 생성자를 통해 필드 이름과 텍스트를 지정하고, writer 객체를 통해 문서를 추가합니다.

QueryParser queryParser = new QueryParser("content", analyzer);
Query query = queryParser.parse("한글");

IndexReader reader = DirectoryReader.open(indexDir);
IndexSearcher searcher = new IndexSearcher(reader);

TopDocs topDocs = searcher.search(query, 10);

for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
    Document result = searcher.doc(scoreDoc.doc);
    System.out.println("검색 결과: " + result.get("content"));
}

위의 코드에서는 QueryParser를 이용하여 쿼리를 생성하고, searcher를 통해 인덱스에서 검색을 수행합니다. TopDocs 객체를 통해 검색 결과를 가져온 뒤, 해당 결과를 출력합니다.

4. 참고자료