lucene 예제

Lucene은 자바 기반의 오픈 소스 검색 엔진 라이브러리로, 빠른 텍스트 검색과 색인 기능을 제공합니다. 이번 예제에서는 Lucene을 사용하여 간단한 검색 기능을 구현하는 방법을 알아보겠습니다.

1. 프로젝트 설정

먼저 Lucene을 사용하기 위해 프로젝트의 의존성을 추가해야 합니다. 아래는 Maven을 사용하는 경우의 설정 예시입니다.

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

2. 인덱스 생성

검색을 위해 먼저 데이터를 색인해야 합니다. 아래는 간단한 텍스트 데이터를 Lucene 인덱스로 변환하는 예제입니다.

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 dataPath, String indexPath) {
        try {
            Directory dir = FSDirectory.open(Paths.get(indexPath));
            IndexWriterConfig config = new IndexWriterConfig(new StandardAnalyzer());

            IndexWriter writer = new IndexWriter(dir, config);

            // 데이터 읽어오기
            List<String> data = readDataFromFile(dataPath);

            // 데이터를 Lucene 문서로 변환하고 인덱싱
            for (String text : data) {
                Document doc = new Document();
                doc.add(new TextField("content", text, Field.Store.YES));
                writer.addDocument(doc);
            }

            writer.close();

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

    private List<String> readDataFromFile(String filePath) {
        // 파일에서 데이터 읽어오는 로직 구현
    }

}

3. 검색 실행

인덱스가 생성되면 이제 검색을 실행할 수 있습니다. 아래는 Lucene을 사용하여 특정 키워드를 포함하는 문서를 검색하는 예제입니다.

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.MultiFieldQueryParser;
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 List<String> searchIndex(String indexPath, String keyword) {
        List<String> searchResults = new ArrayList<>();

        try {
            Directory dir = FSDirectory.open(Paths.get(indexPath));
            IndexReader reader = DirectoryReader.open(dir);
            IndexSearcher searcher = new IndexSearcher(reader);

            // 검색 쿼리 생성
            QueryParser parser = new MultiFieldQueryParser(new String[]{"content"}, new StandardAnalyzer());
            Query query = parser.parse(keyword);

            // 검색 실행
            TopDocs topDocs = searcher.search(query, 10);
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;

            // 검색 결과 추출
            for (ScoreDoc scoreDoc : scoreDocs) {
                Document doc = searcher.doc(scoreDoc.doc);
                String text = doc.get("content");
                searchResults.add(text);
            }

            reader.close();

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

        return searchResults;
    }

}

4. 사용 예시

위의 예제를 통해 인덱스 생성과 검색 기능이 준비되었습니다. 이를 활용하여 다음과 같이 사용할 수 있습니다.

public class Main {

    public static void main(String[] args) {
        Indexer indexer = new Indexer();
        indexer.createIndex("/path/to/data.txt", "/path/to/index");

        Searcher searcher = new Searcher();
        List<String> searchResults = searcher.searchIndex("/path/to/index", "Lucene");

        for (String result : searchResults) {
            System.out.println(result);
        }
    }

}

위의 예시를 실행하면 /path/to/data.txt 파일의 데이터를 인덱싱하고, “Lucene”라는 키워드를 포함하는 문서를 검색한 결과를 출력합니다.

이처럼 Lucene을 활용하면 쉽게 텍스트 검색 기능을 구현할 수 있습니다. 추가적으로 필요한 기능이 있을 경우 Lucene의 다양한 API를 참고하여 구현하면 됩니다.

#Lucene #검색 #자바 #문서인덱싱