[java] 아파치 루신(Apache Lucene)을 사용한 복합 검색 쿼리 처리 방법

아파치 루신은 자바로 개발된 오픈 소스 검색 엔진 라이브러리로, 전문 검색 기능을 제공합니다. 이를 이용하여 복합 검색 쿼리를 처리하는 방법을 알아보겠습니다.

1. 라이브러리 설치

아파치 루신을 사용하기 위해서는 먼저 라이브러리를 설치해야 합니다. Maven 등의 의존성 관리 도구를 통해 아래와 같이 아파치 루신 라이브러리를 추가할 수 있습니다.

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

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 Indexer {
    public static void main(String[] args) {
        try {
            // 인덱스 저장소 생성
            Directory directory = new RAMDirectory();
            
            // 색인 작성기 생성
            IndexWriterConfig indexWriterConfig = new IndexWriterConfig(new StandardAnalyzer());
            IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
            
            // 예시 데이터 추가
            Document document1 = new Document();
            document1.add(new TextField("title", "Apache Lucene 소개", Field.Store.YES));
            document1.add(new TextField("content", "아파치 루신은 오픈 소스 검색 엔진 라이브러리입니다.", Field.Store.YES));
            indexWriter.addDocument(document1);

            Document document2 = new Document();
            document2.add(new TextField("title", "검색 엔진 기술", Field.Store.YES));
            document2.add(new TextField("content", "루신은 검색 엔진의 핵심 기술로 사용됩니다.", Field.Store.YES));
            indexWriter.addDocument(document2);
            
            // 인덱스 쓰기 완료
            indexWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위 코드를 실행하면 메모리에 검색 인덱스가 생성되고, 예시 데이터가 추가될 것입니다.

3. 복합 검색 쿼리 처리

아파치 루신을 사용하여 복합 검색 쿼리를 처리하기 위해서는 색인된 데이터를 기반으로 검색을 수행해야 합니다.

아래는 예시로 title 필드와 content 필드를 동시에 검색하는 코드입니다.

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
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();
            IndexReader indexReader = DirectoryReader.open(directory);
            
            // 검색 객체 생성
            IndexSearcher indexSearcher = new IndexSearcher(indexReader);
            
            // 검색 쿼리 생성
            String[] fields = {"title", "content"};
            MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
            Query query = queryParser.parse("아파치 AND 루신");
            
            // 검색 수행
            TopDocs topDocs = indexSearcher.search(query, 10);
            
            // 검색 결과 출력
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for (ScoreDoc scoreDoc : scoreDocs) {
                Document document = indexSearcher.doc(scoreDoc.doc);
                System.out.println("Title: " + document.get("title"));
                System.out.println("Content: " + document.get("content"));
            }
            
            // 검색 객체 종료
            indexReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위 코드는 “아파치”와 “루신”이 동시에 포함된 데이터를 검색하고, 결과를 출력하는 예시입니다.

4. 참고 자료

위에서 설명한 예시 외에도 아파치 루신은 다양한 검색 기능과 설정 옵션을 제공하므로, 공식 문서와 예제 코드를 참고하여 상세한 사용 방법을 익히는 것을 추천합니다.