[java] 아파치 루신(Apache Lucene)을 활용한 검색 결과 분석 및 시각화 방법

아파치 루신은 자바 언어로 개발된 오픈 소스 검색 엔진입니다. 이 라이브러리를 사용하면 텍스트 기반 데이터에 대한 강력한 검색 기능을 구현할 수 있습니다. 이번 포스트에서는 아파치 루신을 사용하여 검색 결과를 분석하고 시각화하는 방법에 대해 알아보겠습니다.

1. 검색 결과 가져오기

먼저, 아파치 루신을 사용하여 원하는 검색어에 대한 검색 결과를 가져옵니다. 아파치 루신은 색인(index)이라는 구조를 생성하여 검색에 사용합니다. 아래는 검색 결과를 가져오는 간단한 예제 코드입니다.

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 SearchExample {
    public static void main(String[] args) throws IOException {
        // 검색할 색인 디렉토리 설정
        Directory directory = FSDirectory.open(Paths.get("/path/to/index"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        // 검색어 설정
        String queryString = "검색어";
        QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());
        Query query = queryParser.parse(queryString);

        // 검색 결과 가져오기
        TopDocs topDocs = indexSearcher.search(query, 10); // 최대 10개의 검색 결과 가져오기
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;

        for (ScoreDoc scoreDoc : scoreDocs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            // 검색 결과 활용
            System.out.println("검색 결과: " + document.getField("title").stringValue());
        }

        // 검색 종료
        indexReader.close();
        directory.close();
    }
}

위 예제 코드에서 /path/to/index는 루신 색인 디렉토리의 경로로 수정해야 합니다. 또한, queryString 변수에는 원하는 검색어를 설정해야 합니다.

2. 검색 결과 분석하기

아파치 루신을 사용하여 검색 결과를 가져왔으면, 이제 그 결과를 분석해보겠습니다. 아래 예제 코드는 검색 결과에서 검색어가 어떤 문서에 얼마나 자주 등장하는지를 분석하는 예제입니다.

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 SearchAnalysisExample {
    public static void main(String[] args) throws IOException {
        // 검색할 색인 디렉토리 설정
        Directory directory = FSDirectory.open(Paths.get("/path/to/index"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        // 검색어 설정
        String queryString = "검색어";
        QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());
        Query query = queryParser.parse(queryString);

        // 검색 결과 가져오기
        TopDocs topDocs = indexSearcher.search(query, 10); // 최대 10개의 검색 결과 가져오기
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;

        int totalOccurrences = 0;
        for (ScoreDoc scoreDoc : scoreDocs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            String title = document.getField("title").stringValue();
            String content = document.getField("content").stringValue();
            
            // 검색 결과 분석
            int occurrences = countOccurrences(content, queryString);
            System.out.println(title + "에 대한 검색 결과 분석: " + occurrences + "회 등장");
            
            totalOccurrences += occurrences;
        }

        System.out.println("전체 검색 결과 분석: " + totalOccurrences + "회 등장");

        // 검색 종료
        indexReader.close();
        directory.close();
    }

    private static int countOccurrences(String content, String queryString) {
        int count = 0;
        int index = content.indexOf(queryString);
        while (index != -1) {
            count++;
            index = content.indexOf(queryString, index + 1);
        }
        return count;
    }
}

위 예제 코드에서도 루신 색인 디렉토리 경로와 queryString 변수를 수정해야 합니다. countOccurrences 메소드는 주어진 문자열에서 검색어가 등장하는 횟수를 계산하는 간단한 로직입니다.

3. 검색 결과 시각화하기

검색 결과를 시각화하면 전반적인 정보를 한 눈에 파악할 수 있습니다. 아래는 아파치 루신을 사용하여 검색 결과를 시각화하는 예제 코드입니다.

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;
import java.util.HashMap;
import java.util.Map;

public class SearchVisualizationExample {
    public static void main(String[] args) throws IOException {
        // 검색할 색인 디렉토리 설정
        Directory directory = FSDirectory.open(Paths.get("/path/to/index"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        // 검색어 설정
        String queryString = "검색어";
        QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());
        Query query = queryParser.parse(queryString);

        // 검색 결과 가져오기
        TopDocs topDocs = indexSearcher.search(query, 10); // 최대 10개의 검색 결과 가져오기
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;

        Map<String, Integer> resultCountMap = new HashMap<>();
        for (ScoreDoc scoreDoc : scoreDocs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            String category = document.getField("category").stringValue();

            // 검색 결과 시각화
            if (resultCountMap.containsKey(category)) {
                resultCountMap.put(category, resultCountMap.get(category) + 1);
            } else {
                resultCountMap.put(category, 1);
            }
        }

        for (Map.Entry<String, Integer> entry : resultCountMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue() + "개");
        }

        // 검색 종료
        indexReader.close();
        directory.close();
    }
}

위 예제 코드에서는 category 필드를 통해 검색 결과를 카테고리별로 그룹화하여 시각화합니다. 결과는 각 카테고리와 해당 카테고리에 속하는 검색 결과 개수를 출력하는 형태로 나타납니다.

결론

아파치 루신을 사용하여 검색 결과를 분석하고 시각화하는 방법에 대해 알아보았습니다. 이를 통해 검색 엔진에서 제공하는 강력한 검색 기능을 활용하여 데이터를 분석하고 시각화할 수 있습니다. 루신의 다양한 기능을 활용하여 데이터 검색 및 분석에 활용해보세요!

참고: