엘라스틱서치는 일반DBMS와 다르게 페이징된 부분만 조회하는 것이 아니라 모든 데이터를 읽은 뒤 필요한 부분만 짤라서 제공한다. 그렇기 때문에 데이터량이 많아지면 쿼리 비용도 증가한다.
search_after를 이용하면 극복 가능하다# 첫번째 페이지
POST log-2018-12-01/_search
{
"from": 0,
"size": 50,
"query": {
"term": {
"message": "ACCESS"
}
}
}
# 두번째 페이지
POST log-2018-12-01/_search
{
"from": 50,
"size": 50,
"query": {
"term": {
"message": "ACCESS"
}
}
}
sort 파라미터를 이용하면 score에 의한 값이 아닌 필드를 기준으로 정렬을 할수 있다.
POST log-2020-01-01/_search
{
"query": {
"term": {
"message": "ACCESS"
}
},
"sort": [
{ "log_date": "desc" }
]
}
스코어가 같은 경우 secondary 정렬을 사용하도록 할수도 있다.
POST log-2020-01-01/_search
{
"query": {
"term": {
"message": "ACCESS"
}
},
"sort": [
{ "log_date": "desc" },
{ "_score": "desc" }
]
}
URI 방식의 검색시 _source_includes 파라미터를 사용하여 특정 _source 필드만 가져올 수 있었는데, Query DSL 에서도 유사하게 설정할수 있다.
POST log-2020-01-01/_search
{
"query": {
"term": {
"message": "ACCESS"
}
},
"_source": [ "log_date", "message" ]
}