[java] 아파치 루신(Apache Lucene)을 사용한 정확도 조절 검색 구현 방법

아파치 루신은 자바 기반의 오픈소스 검색 엔진 라이브러리로, 풍부한 기능과 뛰어난 성능을 제공합니다. 이번에는 아파치 루신을 사용하여 정확도 조절 검색을 구현하는 방법에 대해 알아보겠습니다.

1. 아파치 루신 설치

먼저, 아파치 루신을 사용하기 위해 아파치 루신을 설치해야 합니다. 아파치 루신 홈페이지에서 최신 버전의 루신을 다운로드 받고 압축을 해제합니다.

2. 색인 생성

아파치 루신은 검색하기 위해 먼저 색인을 생성해야 합니다. 색인은 검색 대상이 되는 문서 집합을 구조화된 형태로 저장하는 과정입니다. 색인을 생성하기 위해서는 데이터를 분석하고 필요한 필드를 정의해야 합니다.

먼저 필요한 의존성을 Maven 또는 Gradle을 이용해 프로젝트에 추가합니다. 그런 다음 아래와 같이 간단한 색인 생성 코드를 작성합니다.

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

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

public class Indexer {

    public void createIndex(String indexPath, String dataPath) {
        try {
            Analyzer analyzer = new StandardAnalyzer();
            Directory directory = FSDirectory.open(Paths.get(indexPath));
            IndexWriterConfig config = new IndexWriterConfig(analyzer);
            IndexWriter writer = new IndexWriter(directory, config);

            // 색인할 데이터를 읽어와서 Document 객체로 변환한 후 색인 작업 수행
            // 예시 코드에선 단순히 파일을 읽어오는 것으로 가정하고, Document 객체에 필드를 추가하는 부분은 생략하였습니다.

            writer.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Indexer indexer = new Indexer();
        indexer.createIndex("index_path", "data_path");
    }
}

위 코드에서는 색인할 데이터를 읽어와서 Document 객체로 변환한 후, IndexWriter를 통해 색인 작업을 수행합니다. 필요에 따라 Document 객체에 필드를 추가해주어야 합니다.

3. 검색

색인이 생성되면, 아파치 루신을 사용하여 정확도 조절 검색을 수행할 수 있습니다. 아래는 간단한 검색 예제 코드입니다.

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

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

public class Searcher {

    public void searchIndex(String indexPath, String queryStr) {
        try {
            Analyzer analyzer = new StandardAnalyzer();
            Directory directory = FSDirectory.open(Paths.get(indexPath));
            IndexReader reader = DirectoryReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(reader);
            
            // QueryParser를 이용해 검색어를 파싱하여 Query 객체 생성
            QueryParser parser = new QueryParser("field_name", analyzer);
            Query query = parser.parse(queryStr);

            // 검색 후 TopDocs 객체를 통해 검색 결과 가져오기
            TopDocs topDocs = searcher.search(query, 10);
            ScoreDoc[] hits = topDocs.scoreDocs;

            // 검색 결과 출력
            for (ScoreDoc hit : hits) {
                Document document = searcher.doc(hit.doc);
                System.out.println(document.get("field_name"));
            }

            reader.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Searcher searcher = new Searcher();
        searcher.searchIndex("index_path", "query_string");
    }
}

위 코드에서는 검색을 수행하기 위해 IndexSearcher와 DirectoryReader를 이용합니다. QueryParser를 통해 검색어를 파싱하여 Query 객체를 생성하고, IndexSearcher를 통해 검색을 수행한 후 결과를 출력합니다.

마무리

위 방법을 통해 아파치 루신을 사용하여 정확도 조절 검색을 구현할 수 있습니다. 아파치 루신은 많은 기능을 제공하므로, 각 기능에 대한 자세한 내용은 아파치 루신 공식 문서를 참고하시기 바랍니다.

참고 자료: