[java] 아파치 루신(Apache Lucene)을 이용한 키워드 재검색 기능의 구현 방법

개요

키워드 재검색 기능은 검색 엔진에서 많이 사용되는 기능 중 하나입니다. 이 기능은 사용자가 검색어를 입력한 후에 검색 결과를 받아본 뒤, 해당 검색 결과 중에서 다시 검색을 수행할 수 있는 기능입니다. 이를 통해 사용자는 좀 더 세부적인 검색을 수행할 수 있게 됩니다.

이번에는 아파치 루신(Apache Lucene)을 이용하여 키워드 재검색 기능을 구현하는 방법에 대해 알아보겠습니다.

Lucene을 이용한 검색 인덱스 생성

  1. Maven 또는 Gradle을 이용하여 Lucene 의존성을 추가합니다.

Maven:

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

Gradle:

implementation 'org.apache.lucene:lucene-core:8.9.0'
  1. 인덱스 생성을 위한 Analyzer와 Directory를 설정합니다.
Analyzer analyzer = new StandardAnalyzer();
Directory directory = FSDirectory.open(Paths.get("/path/to/index/directory"));
  1. IndexWriter를 생성하고 필요한 필드를 추가합니다.
IndexWriterConfig config = new IndexWriterConfig(analyzer);
IndexWriter writer = new IndexWriter(directory, config);

Document document = new Document();
document.add(new TextField("title", "Lucene Introduction", Field.Store.YES));
document.add(new TextField("content", "Lucene is a full-featured text search engine library", Field.Store.YES));

writer.addDocument(document);
writer.commit();
writer.close();

키워드 재검색 기능 구현

  1. 검색어를 이용하여 색인을 검색하는 메소드를 생성합니다.
public List<Document> searchIndex(String searchQuery, int limit) throws IOException, ParseException {
    List<Document> searchResults = new ArrayList<>();

    Analyzer analyzer = new StandardAnalyzer();
    Directory directory = FSDirectory.open(Paths.get("/path/to/index/directory"));
    IndexReader reader = DirectoryReader.open(directory);
    IndexSearcher searcher = new IndexSearcher(reader);

    QueryParser queryParser = new QueryParser("content", analyzer);
    Query query = queryParser.parse(searchQuery);

    TopDocs topDocs = searcher.search(query, limit);
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;

    for (ScoreDoc scoreDoc : scoreDocs) {
        Document document = searcher.doc(scoreDoc.doc);
        searchResults.add(document);
    }

    reader.close();
    return searchResults;
}
  1. 검색 결과를 토대로 키워드 재검색을 수행하는 메소드를 생성합니다.
public List<Document> performKeywordSearch(String searchQuery, String keyword, int limit) throws IOException, ParseException {
    List<Document> keywordResults = new ArrayList<>();

    // 검색어로 색인을 검색
    List<Document> searchResults = searchIndex(searchQuery, limit);

    // 검색 결과 중에서 키워드를 포함하는 문서 필터링
    for (Document document : searchResults) {
        String content = document.get("content");
        if (content.contains(keyword)) {
            keywordResults.add(document);
        }
    }

    return keywordResults;
}

실행 예시

public static void main(String[] args) throws IOException, ParseException {
    String searchQuery = "Lucene introduction";
    String keyword = "search";
    int limit = 10;

    // 키워드 재검색 수행
    List<Document> keywordResults = performKeywordSearch(searchQuery, keyword, limit);

    // 결과 출력
    for (Document document : keywordResults) {
        System.out.println("Title: " + document.get("title"));
        System.out.println("Content: " + document.get("content"));
        System.out.println("---");
    }
}

결론

아파치 루신을 이용하여 키워드 재검색 기능을 구현하는 방법에 대해 알아보았습니다. 이를 통해 사용자는 세부적인 검색을 수행하여 원하는 결과를 더욱 정확하게 얻을 수 있게 됩니다.

더 자세한 내용은 아파치 루신 공식 문서를 참고하시기 바랍니다.

아파치 루신 공식 문서