[java] 아파치 루신(Apache Lucene)을 이용한 유사한 문서 검색 방법

아파치 루신은 자바로 구현된 오픈소스 검색 엔진으로, 높은 성능과 확장성을 제공합니다. 이를 이용해 유사한 문서를 검색하는 방법을 알아보겠습니다.

1. 라이브러리 추가

아파치 루신을 사용하기 위해서는 먼저 해당 라이브러리를 프로젝트에 추가해야 합니다. Maven을 사용한다면 아래와 같이 pom.xml 파일에 의존성을 추가합니다.

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

Gradle을 사용한다면 아래와 같이 build.gradle 파일에 의존성을 추가합니다.

implementation 'org.apache.lucene:lucene-core:8.10.1'

2. 문서 색인

먼저 유사한 문서를 검색하기 위해 검색 대상 문서를 색인해야 합니다. 루신은 문서를 색인으로 변환하여 검색에 사용합니다.

import org.apache.lucene.analysis.standard.StandardAnalyzer;
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.RAMDirectory;

public class DocumentIndexer {
    public void indexDocuments() {
        try {
            // 검색 엔진 설정
            StandardAnalyzer analyzer = new StandardAnalyzer();
            Directory indexDirectory = new RAMDirectory();
            IndexWriterConfig config = new IndexWriterConfig(analyzer);
            IndexWriter indexWriter = new IndexWriter(indexDirectory, config);

            // 문서 색인
            Document doc1 = new Document();
            doc1.add(new TextField("content", "루신을 이용한 문서 검색 방법", Field.Store.YES));

            Document doc2 = new Document();
            doc2.add(new TextField("content", "아파치 루신을 사용해 문서를 검색해보자", Field.Store.YES));

            indexWriter.addDocument(doc1);
            indexWriter.addDocument(doc2);

            // 색인 종료
            indexWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위 예제에서는 StandardAnalyzer를 사용하여 문서를 분석하고, RAMDirectory를 사용하여 색인을 메모리에 저장합니다. 색인할 문서는 Document 객체에 TextField로 추가하고, IndexWriter를 통해 색인을 추가합니다.

3. 유사한 문서 검색

색인된 문서를 기반으로 유사한 문서를 검색해보겠습니다.

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;

public class DocumentSearcher {
    public void searchDocuments(String keyword) {
        try {
            // 검색 엔진 설정
            StandardAnalyzer analyzer = new StandardAnalyzer();
            Directory indexDirectory = new RAMDirectory();
            IndexWriterConfig config = new IndexWriterConfig(analyzer);
            IndexWriter indexWriter = new IndexWriter(indexDirectory, config);
            IndexReader indexReader = DirectoryReader.open(indexWriter);
            IndexSearcher searcher = new IndexSearcher(indexReader);

            // 검색 키워드 생성
            Term term = new Term("content", keyword);
            Query query = new TermQuery(term);

            // 검색 수행
            TopDocs topDocs = searcher.search(query, 10);

            // 검색 결과 출력
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for (ScoreDoc scoreDoc : scoreDocs) {
                Document doc = searcher.doc(scoreDoc.doc);
                System.out.println(doc.get("content"));
            }

            // 검색 종료
            indexWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위 예제에서는 입력한 키워드와 content 필드를 비교하여 유사한 문서를 검색합니다. 검색 결과는 scoreDocs에 저장되며, Documentget 메소드를 통해 문서의 내용을 가져올 수 있습니다.

결론

이렇게 아파치 루신을 활용하여 유사한 문서를 검색하는 방법을 알아보았습니다. 아파치 루신은 다양한 기능과 확장성을 제공하므로, 다양한 검색 요구사항에 활용할 수 있습니다.

아파치 루신 공식 홈페이지를 참고하시면 더 자세한 내용을 확인할 수 있습니다.