[java] 아파치 루신(Apache Lucene)을 이용한 다국어 검색 지원

이번 글에서는 아파치 루신(Apache Lucene)을 이용하여 다국어 검색을 지원하는 방법에 대해 알아보겠습니다.

1. 아파치 루신(Apache Lucene)이란?

아파치 루신은 자바로 개발된 오픈 소스 검색 엔진입니다. 이 라이브러리는 다양한 형식의 텍스트 데이터에 대한 검색 기능을 제공합니다. 풍부한 기능과 안정성으로 유명하며, 다양한 언어로 검색을 지원합니다.

2. 다국어 검색을 위한 아파치 루신 설정

아파치 루신은 검색 기능을 제공하기 위해 인덱스를 생성해야 합니다. 이때, 다국어 검색을 지원하기 위해서는 적절한 언어 분석기를 설정해야 합니다. 아파치 루신은 다양한 언어에 대한 언어 분석기를 제공하므로, 해당 언어에 맞는 분석기를 사용하면 됩니다.

아래는 예시로 영어와 한국어에 대한 언어 분석기를 설정하는 코드입니다.

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.en.EnglishAnalyzer;
import org.apache.lucene.analysis.ko.KoreanAnalyzer;

public class SearchIndexer {

    public static void main(String[] args) {
        // English Analyzer 설정
        Analyzer englishAnalyzer = new EnglishAnalyzer();

        // Korean Analyzer 설정
        Analyzer koreanAnalyzer = new KoreanAnalyzer();
    }
}

위 코드에서 EnglishAnalyzer는 영어에 대한 언어 분석기를, KoreanAnalyzer는 한국어에 대한 언어 분석기를 나타냅니다. 이렇게 설정한 언어 분석기를 이용하여 검색 인덱스를 생성하고, 사용자가 입력한 검색어를 해당 언어에 맞게 분석해 검색을 수행할 수 있습니다.

3. 다국어 검색 예제

다국어 검색을 위한 예제 코드입니다. 이 예제에서는 인덱스 생성과 검색을 위해 아파치 루신의 IndexWriterIndexSearcher 클래스를 활용합니다.

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.en.EnglishAnalyzer;
import org.apache.lucene.analysis.ko.KoreanAnalyzer;
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.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.FSDirectory;

import java.io.IOException;
import java.nio.file.Paths;

public class MultilingualSearch {

    public static void main(String[] args) throws IOException {
        Analyzer analyzer;
        String searchQuery;

        // 검색어와 언어에 따라 언어 분석기 설정
        if (isKoreanQuery()) {
            analyzer = new KoreanAnalyzer();
        } else {
            analyzer = new EnglishAnalyzer();
        }

        // 인덱스를 읽기 위한 DirectoryReader 생성
        DirectoryReader directoryReader = DirectoryReader.open(FSDirectory.open(Paths.get("index")));

        // IndexSearcher 생성
        IndexSearcher indexSearcher = new IndexSearcher(directoryReader);

        // 다중 필드로 검색 쿼리 생성
        MultiFieldQueryParser queryParser = new MultiFieldQueryParser(new String[]{"title", "content"}, analyzer);

        // 사용자 입력에 따른 검색어 생성
        searchQuery = getSearchQueryFromUser();

        Query query;
        try {
            query = queryParser.parse(searchQuery);
        } catch (org.apache.lucene.queryparser.classic.ParseException e) {
            e.printStackTrace();
            return;
        }

        // TopDocs를 통한 상위 검색 결과 가져오기
        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] hits = topDocs.scoreDocs;

        // 검색 결과 출력
        for (ScoreDoc hit : hits) {
            Document document = indexSearcher.doc(hit.doc);
            System.out.println("Title: " + document.get("title"));
            System.out.println("Content: " + document.get("content"));
        }
    }

    private static boolean isKoreanQuery() {
        // 검색어가 한국어인지 판별하는 로직
    }

    private static String getSearchQueryFromUser() {
        // 사용자로부터 검색어를 입력받는 로직
    }
}

위 예제 코드는 검색어와 언어에 따라 적절한 언어 분석기를 선택하고, 사용자로부터 검색어를 입력받아 해당 검색어를 이용하여 검색을 수행하는 예제입니다. 검색 결과는 상위 10개의 결과를 출력합니다.

4. 결론

아파치 루신을 이용하여 다국어 검색을 지원할 수 있습니다. 적절한 언어 분석기를 설정하고, 인덱스를 생성한 후 검색을 수행할 수 있다는 것을 알아두세요. 이를 통해 다양한 언어로 작성된 텍스트 데이터에 대한 효율적인 검색을 제공할 수 있습니다.

참고 자료