이번 글에서는 URI 또는 Query DSL을 통해 조회된 document들에 대해서 결과를 가공하는 방법에 대해 알아보겠습니다.
이 글은 공식문서를 참고했으며, 검색 결과 response에 대한 각 필드의 설명은 여기를 참고해주세요.
실습을 위한 테스트 데이터 셋팅은 여기을 참고하시길 바랍니다.
아래의 예제들을 실행하기 위해서는 query.json 파일을 만들어서 각 예제마다 수정을 하고, 명령어는 모두 다음과 같이 실행하면 됩니다.
# curl -XGET 'localhost:9200/bank/account/_search?pretty' -H 'Content-Type: application/json' -d @query.json
1. from / size ( 참고 )
from과 size 필드는 pagination 개념과 관련있습니다.
예를 들어, 게시판 페이징을 할 때 쪽수는 from이 되고, size는 한 번에 나타날 게시글의 수가 됩니다.
즉, SQL로 따지면 from은 offset, size는 limit이 되겠죠.
아래는 3개의 document만 반환하도록 조회하는 예제입니다.
{ "from" : 0,
"size" : 3, "query":{ "match_all":{} } }
from과 size 쿼리는 index setting인 index.max_result_window에 설정된 값을 초과할 수 없습니다.
해당 설정은 기본 값이 10,000이며, 즉, 최대 10,000개의 document를 호출할 수 있고 그 이상 호출을 하려면 scroll API를 사용해야 합니다.
2. sort ( 참고 )
sort 쿼리로 특정 필드마다 하나 이상의 정렬을 추가 할 수 있습니다.
sort 쿼리를 사용하지 않을 경우, 기본 정렬은 _score 내림차순(desc)이며, 다른 항목으로 정렬할 경우 오름차순(asc)으로 기본 설정됩니다.
아래는 age 필드에 대해 내림차순으로 정렬한 후, balance 필드에 대해 내림차순으로 정렬하고 _socre를 내림차순으로 정렬하는 예제입니다.
{
"sort" : [
{ "age" : "desc" },
{ "balance" : "desc" },
"_score"
],
"query":{
"match_all":{}
}
}
3. source filtering ( 참고 )
_source 필드를 통해 검색된 데이터에서 특정 필드들만 반환하도록 할 수 있습니다.
SQL에서 SELECT 쿼리를 날릴 때 특정 컬럼들을 명시하는 것과 유사합니다.
아래는 검색된 document들에 대해 모든 필드들을 응답받지 않는 예제입니다.
{
"_source": false,
"query":{
"match_all":{}
}
}
검색된 document의 총 개수만 알고 싶을 경우, _source를 노출시키지 않음으로써 성능을 높일 수 있습니다.
아래는 검색된 document들에 대해 firstname, lastname 필드만 응답받는 예제입니다.
{ "_source": ["firstname","lastname"], "query":{ "match_all":{} } }
그 밖에 *를 사용하여 필드명을 명시할 수 있고, includes/excludes를 사용하여 필드를 포함 제외할 수 있습니다.
4. aggregations ( 참고 )
aggregations는 집계를 의미하며 aggs 필드를 통해 document 개수를 통계낼 수 있습니다.
SQL에서 GROUP BY와 유사합니다.
ES는 검색 엔진인 만큼 다양한 통계 방식을 제공하는데요, 이 글에서 모두 다를 수 없으므로 공식 문서를 참고하시길 바랍니다.
아래는 address에 street 문자열이 포함된 document들의 balance 필드 값들을 평균내는 예제입니다.
{ "query": { "term": { "address" : "street" } }, "aggs" : { "avg_balance_test" : { "avg" : { "field" : "balance" } } } }
- avg_balance_test
- response 데이터에 명시될 통계 결과 필드명을 의미하며, 원하는대로 작성하면 됩니다.
- avg
- 집계 타입을 의미하며, sum, cardinality 등 여러가지가 있습니다.
- field
- 어떤 필드에 대해 통계를 낼 것인지 명시하며, 위 예제에서는 balance 필드에 대한 집계를 했습니다.
이상으로 검색 결과를 가공하는 방법에 대해 알아보았습니다.
aggregations는 통계를 낼 때 매우 유용하다고 생각하지만, 저는 아직 많이 사용해보지 않아서 자세히 못다뤘네요..