Framework/Spring

[Spring] Elasticsearch에서 다중 정렬하기 (feat. java, query DSL) - 컴도리돌이

컴도리돌이 2024. 10. 29. 09:00
728x90

Elasticsearch를 도입하면서 기존에 사용했던 데이터 조회를 Elasticsearch Query DSL 방식으로 변경하고자 하니, 생각 외로 어려움이 많았습니다. 🙄 그중에서 알고 나서는 쉽지만, 처음에는 어떻게 하는지 막막했던 정렬 부분을 다뤄보려고 해요. 😊

Elasticsearch Query DSL을 통한 다중 정렬

일단 Query DSL에서 sort 배열을 사용하여 여러 필드를 지정하여 정렬할 수 있어요. 아래는 기본적인 예시입니다.

{
  "query": {
    "match_all": {}
  },
  "sort": [
    { "field1.keyword": { "order": "asc" } },
    { "field2": { "order": "desc" } }
  ]
}

 

위 예제에서 field1은 오름차순으로 정렬되고, field2는 내림차순으로 정렬됩니다. 이렇게 여러 필드를 정렬 기준으로 사용할 수 있다는 것이 Query DSL의 큰 장점이죠.

Java 코드로 다중 정렬 구현하기

그렇다면, 자바에서는 위의 쿼리 코드를 어떻게 사용할까요? 🤔 Java에서 Elasticsearch 클라이언트를 사용할 경우, List <SortOptions>를 활용해 다중 정렬을 설정할 수 있어요. 아래는 Java 코드를 사용하여 Elasticsearch에 다중 정렬을 구현하는 방법이에요.

import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOptions;
import org.elasticsearch.search.sort.SortOrder;

import java.util.ArrayList;
import java.util.List;

// 다중 정렬 설정
List<SortOptions> sortOptions = new ArrayList<>();
sortOptions.add(SortOptions.of(s -> s.field(f -> f.field("field1.keyword").order(SortOrder.Asc))));
sortOptions.add(SortOptions.of(s -> s.field(f -> f.field("field2.keyword").order(SortOrder.Desc))));

// 쿼리 빌드
SearchRequest searchRequest = new SearchRequest("index_name")
        .source(sourceBuilder -> sourceBuilder.sort(sortOptions));

 

이 코드에서는 sortOptions 리스트가 정렬할 필드를 추가하는 곳이에요. 여기서 field1과 field2에 대한 정렬 기준을 설정하죠. Elasticsearch는 sort 배열에서 정의한 순서에 따라 정렬을 수행합니다. 즉, 자바에서는 sortOptions 리스트에 먼저 넣은 field1 필드에 대한 정렬 옵션이 가장 높은 우선순위를 가지게 되죠. 😊

그 다음에 순차적으로 리스트에 있는 필드가, 그 다음 우선순위를 가지게 됩니다. 이처럼 다중 정렬을 통해 더 정교한 검색 결과를 제공할 수 있는 것이 Elasticsearch의 매력이 아닐까 싶어요.

정렬 조건을 잘 설정해 두면, 사용자에게 보다 의미 있는 데이터를 빠르게 제공할 수 있어요. 앞으로 Elasticsearch를 더 활용하는 데 도움이 되길 바랍니다! 😊


 

Introduction to Spring Data Elasticsearch | Baeldung

In this article we explore the basics of Spring Data Elasticsearch and we show how to index, search, and query data with the framework.

www.baeldung.com

 

Sort search results | Elasticsearch Guide [8.15] | Elastic

To avoid overflow, the conversion to date_nanos cannot be applied on dates before 1970 and after 2262 as nanoseconds are represented as longs.

www.elastic.co