[java] 아파치 루신(Apache Lucene) 검색 결과의 페이징 기능 구현 방법

아파치 루신은 자바로 개발된 오픈 소스 검색 엔진입니다. 루신을 사용하여 검색 결과를 페이징하는 기능을 구현해보겠습니다.

1. 검색 쿼리 작성하기

먼저, 검색할 쿼리를 작성해야 합니다. 아파치 루신은 검색 결과를 기반으로 페이징을 구현하기 때문에, 검색 쿼리를 작성해야 합니다.

String keyword = "검색어";
int pageNumber = 1;
int pageSize = 10;

QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());
Query query = queryParser.parse(keyword);

int startIndex = (pageNumber - 1) * pageSize;
int endIndex = startIndex + pageSize - 1;

위의 코드에서 keyword는 검색할 키워드를 나타내고, pageNumber는 보여줄 페이지 번호를 나타냅니다. pageSize는 한 페이지에 보여줄 결과의 개수입니다.

2. 검색 결과 가져오기

검색 결과를 가져오기 위해 IndexSearcher 객체를 생성해야 합니다. 이 객체를 사용하여 검색을 수행하고 결과를 가져올 수 있습니다.

IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File("인덱스 디렉토리 경로")));
IndexSearcher indexSearcher = new IndexSearcher(indexReader);

TopDocs topDocs = indexSearcher.search(query, endIndex + 1);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;

위의 코드에서 인덱스 디렉토리 경로는 아파치 루신의 인덱스를 저장하는 디렉토리의 경로를 나타냅니다. search 메서드를 사용하여 검색을 수행하고, TopDocs 객체를 반환받습니다. scoreDocs 배열은 검색 결과를 담고 있습니다.

3. 페이징 처리하기

검색 결과를 페이징하여 보여주는 부분을 구현해야 합니다. 앞서 정의한 startIndexendIndex를 사용하여 결과를 필요한 범위로 잘라내고, 페이지 번호와 총 페이지 수도 계산합니다.

int totalResults = scoreDocs.length;

int totalPages = (int) Math.ceil((double) totalResults / pageSize);
if (pageNumber > totalPages) {
    pageNumber = totalPages;
}

int resultsToSkip = Math.max(0, startIndex);
int resultsToFetch = Math.min(pageSize, totalResults - resultsToSkip);

List<Document> results = new ArrayList<>();
for (int i = resultsToSkip; i < resultsToSkip + resultsToFetch; i++) {
    Document document = indexSearcher.doc(scoreDocs[i].doc);
    results.add(document);
}

위의 코드에서 totalResults는 총 검색 결과의 개수를 나타냅니다. totalPages는 총 페이지 수를 계산합니다. 만약 요청한 페이지 번호가 총 페이지 수를 초과한다면, 마지막 페이지로 설정합니다.

resultsToSkipresultsToFetch는 잘라낼 결과의 범위를 계산합니다. resultsToSkip은 결과에서 스킵할 개수를, resultsToFetch는 가져와야 할 개수를 나타냅니다.

마지막으로, results 리스트에 검색 결과를 담습니다. scoreDocs 배열에서 해당하는 문서를 가져와 리스트에 추가합니다.

이제 위의 코드를 사용하면 아파치 루신의 검색 결과를 페이징하여 보여줄 수 있습니다.

위의 예제는 아파치 루신 검색 결과의 페이징 기능을 구현하는 방법에 대한 간단한 예제입니다. 실제 사용할 때에는 복잡한 검색 쿼리나 사용자 인터페이스와의 통합 등 다양한 요구사항을 고려해야 합니다.


참고 문서: