[java] 아파치 루신(Apache Lucene)을 사용한 결과 페이지 분할 처리 방법

아파치 루신은 검색 기능을 위한 오픈 소스 라이브러리로, 대량의 텍스트 데이터를 검색하고 관리하는데 사용됩니다. 이 라이브러리를 사용하면 검색 결과를 페이지로 분할하여 사용자가 효율적으로 결과를 탐색할 수 있습니다. 이번 글에서는 아파치 루신을 사용하여 결과 페이지를 분할하는 방법에 대해 알아보겠습니다.

1. 검색 결과 페이지의 구성

아파치 루신을 사용하여 결과 페이지를 분할하기 위해서는 먼저 검색 결과의 구성을 이해해야 합니다. 일반적으로 검색 결과 페이지는 검색어에 대응하는 문서들의 목록으로 구성됩니다. 각 문서는 제목, 본문, 작성자 등의 속성을 가지고 있으며, 게시일자나 추천 수 등의 기준에 따라 정렬되어 표시됩니다.

2. 페이지 분할 처리 방법

아파치 루신을 사용하여 검색 결과 페이지를 분할하기 위해서는 다음과 같은 단계를 따를 수 있습니다:

2.1. 검색 작업 수행

먼저 사용자가 입력한 검색어를 기반으로 아파치 루신을 사용하여 검색 작업을 수행합니다. 이때 검색 결과는 문서들의 집합으로 반환됩니다.

// 아파치 루신을 초기화하고 검색 인덱스를 생성합니다.
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(Paths.get("검색인덱스경로")));
IndexSearcher indexSearcher = new IndexSearcher(indexReader);

// 검색어에 대한 쿼리를 생성합니다.
QueryParser queryParser = new QueryParser("본문", new StandardAnalyzer());
Query query = queryParser.parse("검색어");

// 검색 작업을 수행하고 결과를 가져옵니다.
TopDocs topDocs = indexSearcher.search(query, 10);

2.2. 페이지 분할

검색 작업을 수행한 후, 반환된 문서들을 페이지로 분할합니다. 이를 위해서는 검색 결과의 전체 개수와 한 페이지에 표시할 문서의 개수, 현재 페이지 번호 등을 고려해야 합니다.

// 한 페이지에 표시할 문서의 개수와 현재 페이지 번호를 설정합니다.
int pageSize = 5;
int pageNo = 2;

// 페이지 분할을 위한 범위를 계산합니다.
int start = (pageNo - 1) * pageSize;
int end = Math.min(start + pageSize, topDocs.totalHits);

// 페이지에 표시할 문서들을 추출합니다.
ScoreDoc[] hits = topDocs.scoreDocs;
List<Document> documents = new ArrayList<>();
for (int i = start; i < end; i++) {
    Document document = indexSearcher.doc(hits[i].doc);
    documents.add(document);
}

2.3. 결과 페이지 출력

마지막으로 추출된 문서들을 사용하여 결과 페이지를 출력합니다. 각 문서의 속성들을 이용하여 결과를 표시하고, 페이지 번호에 따라 이전 페이지와 다음 페이지로 이동할 수 있는 링크를 추가합니다.

// 검색 결과 페이지를 출력합니다.
for (Document document : documents) {
    String title = document.get("제목");
    String content = document.get("본문");

    // 결과를 화면에 표시합니다.
    System.out.println("제목: " + title);
    System.out.println("본문: " + content);
    System.out.println("---------------------");
}

// 이전 페이지와 다음 페이지로 이동할 수 있는 링크를 추가합니다.
if (pageNo > 1) {
    System.out.println("<a href='/검색결과?page=" + (pageNo - 1) + "'>이전 페이지</a>");
}
if (end < topDocs.totalHits) {
    System.out.println("<a href='/검색결과?page=" + (pageNo + 1) + "'>다음 페이지</a>");
}

3. 결론

이상으로 아파치 루신을 사용하여 검색 결과 페이지를 분할하는 방법에 대해 알아보았습니다. 검색 결과를 효율적으로 탐색하기 위해서는 페이지 분할이 필수적입니다. 아파치 루신은 이러한 페이지 분할을 위한 강력한 기능을 제공하므로, 검색 기능을 구현할 때 많은 참고가 될 것입니다.

참고 문서