Springboot

Spring Data ElasticSearch NativeSearchQuery Paging 처리

25G 2022. 12. 7. 17:56

es에 복잡한 쿼리를 날리기 위해서 보통 QueryBuilders를 활용해서 간편하게 문자열을 만들 수 있습니다. 이때 페이징 처리를 하기 위해서는 조회하고자 하는 query를 만든 다음다음과 같이 해결했습니다.

    private final SearchOperations searchOperations;


NativeSearchQuery result = new NativeSearchQueryBuilder()
        .withFields(fields)
        .withPageable(PageRequest.of(Math.toIntExact(pageable.getOffset()), pageable.getPageSize()))
        .withSort(Sort.by("id").descending()) //desc or asc
        .withQuery(resultQuery)
        .build();

List<SearchHit<dataDto>> data = searchOperations.search(result, dataDto.class, IndexCoordinates.of("index")).getSearchHits();
long count = searchOperations.count(result, IndexCoordinates.of("index")); // 해당 조건의 결과 데이터 갯수

List<dataDto> results = new ArrayList<>();
data.forEach(t -> results.add(t.getContent()));
return new PageImpl<>(results, pageable, count);