[java] 아파치 루신(Apache Lucene)을 이용한 자동 완성 기능 구현 방법

아파치 루신(Apache Lucene)은 자바로 작성된 오픈 소스 검색 엔진 라이브러리입니다. 이를 사용하면 다양한 검색 기능을 구현할 수 있습니다. 이번에는 아파치 루신을 이용하여 자동 완성 기능을 구현하는 방법에 대해 알아보겠습니다.

1. 아파치 루신 설치 및 설정

아파치 루신을 사용하기 위해서는 먼저 아파치 루신을 다운로드하고 설치해야 합니다. 아파치 루신의 공식 웹사이트에서 최신 버전을 다운로드하고 압축을 해제합니다.

설치가 완료되면, 루신의 색인 생성 및 검색에 필요한 설정 파일을 생성해야 합니다. 설정 파일은 주로 conf 또는 config 디렉토리에 위치합니다. 예를 들어, lucene.properties 또는 lucene.xml과 같은 이름으로 파일을 생성합니다.

2. 자동 완성 데이터 색인 생성

자동 완성 기능을 구현하기 위해서는 먼저 검색할 데이터를 루신에 색인해야 합니다. 루신은 검색 가능한 문서를 색인화하여 검색에 사용할 수 있는 형태로 변환해줍니다.

자동 완성 데이터를 색인화하기 위해, 아래와 같은 단계를 따릅니다:

2.1. 데이터 준비

자동 완성에 사용할 데이터를 준비합니다. 일반적으로 자동 완성 데이터는 단어, 문장, 또는 검색어와 관련된 데이터를 사용합니다.

2.2. 색인 구조 설계

루신에서는 색인 구조를 설계하여 검색 성능을 최적화할 수 있습니다. 색인 구조에는 필드, 문서, 텀, 텀 벡터 등이 포함됩니다. 적절한 색인 구조를 설계하여 데이터를 색인화합니다.

2.3. 데이터 색인화

루신을 사용하여 데이터를 색인화합니다. 데이터를 색인화하면, 검색에 사용할 수 있는 형태로 데이터가 변환됩니다.

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;

public class AutoCompleteIndexer {
    private String indexPath; // 색인 디렉토리 경로
    private List<String> data; // 자동 완성 데이터
    
    public AutoCompleteIndexer(String indexPath, List<String> data) {
        this.indexPath = indexPath;
        this.data = data;
    }
    
    public void index() {
        try {
            FSDirectory directory = FSDirectory.open(Paths.get(indexPath));
            IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());
            
            IndexWriter writer = new IndexWriter(directory, config);
            writer.deleteAll(); // 기존에 생성된 색인 삭제
            
            for (String item : data) {
                Document document = new Document();
                document.add(new Field("text", item, TextField.TYPE_STORED));
                writer.addDocument(document);
            }
            
            writer.close();
            directory.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위 예제 코드는 AutoCompleteIndexer 클래스를 정의하여 데이터를 색인화하는 기능을 구현한 예시입니다. indexPath에는 색인 디렉토리 경로를, data에는 자동 완성 데이터를 전달하여 사용할 수 있습니다.

3. 자동 완성 검색 기능 구현

데이터를 색인화한 후에는 자동 완성 기능을 구현할 수 있습니다. 사용자가 입력한 검색어를 기반으로 색인화된 데이터 중에서 일치하는 항목을 찾아내어 추천해주는 기능입니다.

자동 완성 검색 기능을 구현하기 위해, 아래와 같은 단계를 따릅니다:

3.1. 검색어 토큰화

사용자가 입력한 검색어를 토큰화하여 검색에 사용할 수 있는 형태로 변환합니다. 이를 통해 검색어와 색인화된 데이터를 비교할 수 있습니다.

3.2. 데이터 검색

색인화된 데이터를 검색하여 일치하는 항목을 찾아냅니다.

3.3. 추천 결과 반환

검색 결과 중에서 추천 결과를 사용자에게 반환합니다.

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.FSDirectory;

public class AutoCompleteSearcher {
    private String indexPath; // 색인 디렉토리 경로
    
    public AutoCompleteSearcher(String indexPath) {
        this.indexPath = indexPath;
    }
    
    public List<String> search(String input) {
        List<String> results = new ArrayList<>();
        
        try {
            FSDirectory directory = FSDirectory.open(Paths.get(indexPath));
            IndexReader reader = DirectoryReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(reader);
            
            String[] fields = {"text"};
            MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
            Query query = parser.parse(input);
            
            TopDocs topDocs = searcher.search(query, 10); // 최대 10개의 결과를 반환
            
            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                Document doc = searcher.doc(scoreDoc.doc);
                results.add(doc.get("text"));
            }
            
            reader.close();
            directory.close();
        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
        
        return results;
    }
}

위 예제 코드는 AutoCompleteSearcher 클래스를 정의하여 자동 완성 검색 기능을 구현한 예시입니다. indexPath에는 색인 디렉토리 경로를 전달하고, search() 메서드에는 사용자가 입력한 검색어를 전달하여 추천 결과를 받을 수 있습니다.

마무리

이렇게 아파치 루신을 이용하여 자동 완성 기능을 구현할 수 있습니다. 아파치 루신의 강력한 검색 기능을 활용하여 다양한 검색 기능을 구현해보세요.

참고 자료