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

아파치 루신은 자바 기반의 오픈소스 검색 엔진 라이브러리로, 빠르고 정확한 텍스트 검색을 제공합니다. 이를 활용하여 정확한 일치 검색을 구현하는 방법을 알아보겠습니다.

1. 루신 프로젝트 설정

루신을 사용하기 위해서는 프로젝트에 루신의 의존성을 추가해야 합니다. Maven을 사용하는 경우 pom.xml 파일에 다음과 같은 의존성을 추가하세요.

<dependencies>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>8.8.1</version>
    </dependency>
</dependencies>

2. 색인 생성

루신은 검색 대상이 되는 문서들을 색인(index)으로 생성하여 검색 속도를 향상시킵니다. 먼저, 검색할 문서들을 적절하게 분석해야 합니다. 아래는 간단한 예시입니다.

import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;

public class IndexCreator {
    public static void main(String[] args) {
        try {
            Directory directory = new RAMDirectory();
            
            SimpleAnalyzer analyzer = new SimpleAnalyzer();
            IndexWriterConfig config = new IndexWriterConfig(analyzer);
            IndexWriter writer = new IndexWriter(directory, config);
            
            Document doc = new Document();
            doc.add(new StringField("id", "1", Field.Store.YES));
            doc.add(new StringField("content", "Hello world", Field.Store.YES));
            
            writer.addDocument(doc);
            writer.close();
            
            System.out.println("Index created successfully!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 예제 코드는 메모리 기반의 색인을 생성하는 방법입니다. 색인 대상 문서는 Document 객체로 표현되며, 각각의 문서는 필드(Field)로 구성됩니다. 필드는 식별자(id)와 내용(content)으로 구성되어 있습니다.

3. 검색 수행

색인이 준비되면, 루신을 이용하여 검색을 수행할 수 있습니다. 아래는 간단한 검색 예제입니다.

import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
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.RAMDirectory;

public class Searcher {
    public static void main(String[] args) {
        try {
            Directory directory = new RAMDirectory();
            
            SimpleAnalyzer analyzer = new SimpleAnalyzer();
            IndexReader reader = DirectoryReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(reader);
            
            QueryParser parser = new QueryParser("content", analyzer);
            Query query = parser.parse("Hello");
            
            TopDocs results = searcher.search(query, 10);
            ScoreDoc[] hits = results.scoreDocs;
            
            for (ScoreDoc hit : hits) {
                Document doc = searcher.doc(hit.doc);
                System.out.println("Document ID: " + doc.get("id") + ", Content: " + doc.get("content"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 예제는 저장된 문서들 중에서 “Hello”라는 단어가 포함된 문서를 검색하는 방법을 보여줍니다. 검색 결과는 ScoreDoc 객체로 반환되며, 이를 이용하여 검색된 문서를 가져올 수 있습니다.

참고 자료