반응형
Elasticsearch 는 한번에 최대 10,000개의 도큐먼트만 반환한다. 이 외에 size를 정해서 query를 날려 조회해올 경우에도 이전에 조회해온 것 이후부터 다시 가져올 때 필요한 기능이 search_after이다.
실습해보기 🐠
1. after_test 인덱스 생성
PUT after_test
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"place": {
"type": "keyword"
},
"reviews": {
"type": "text"
}
}
}
}
2. 데이터 5개 입력
POST after_test/_doc
{
"id": 5,
"place": "섬진강",
"reviews": "ㄹ리뷰"
}
x 5
3. 일반적인 방법으로 데이터 2개만 가져와보기
쿼리
GET after_test/_search
{
"size": 2,
"query":{
"match_all": {}
}
}
결과
#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.17/security-minimal-setup.html to enable security.
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "after_test",
"_type" : "_doc",
"_id" : "KNa7z4IBnZsIFAhknfdf",
"_score" : 1.0,
"_source" : {
"id" : 1,
"place" : "낙동강",
"reviews" : "오리알"
}
},
{
"_index" : "after_test",
"_type" : "_doc",
"_id" : "S9a7z4IBnZsIFAhkuPfn",
"_score" : 1.0,
"_source" : {
"id" : 2,
"place" : "한강",
"reviews" : "괴물"
}
}
]
}
}
여기에서 이제부터 다음 3번째 도큐먼트부터 2개를 또 가져오고 싶을 때, 쿼리에 search_after 기능을 넣어주면 된다.
조회 쿼리에 sort를 정해준다.
- search_after를 위해서는 모든 도큐먼트가 정렬된 상태에서 1~100번, 101~200번 이렇게 가져와야하는데 elasticsearch는 데이터가 정렬되어 있지 않으므로 sort를 정해주는 것 같다. 찾아보니 보통 두개씩은 해주는 것 같다! 유니크한 키가 있어도 혹시나해서 그런갑다. (뇌피셜)
GET after_test/_search
{
"size": 2,
"query":{
"match_all": {}
},
"sort": [
{"id": "asc"},
{"place": "desc"}
]
}
이렇게 나온 결과
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "after_test",
"_type" : "_doc",
"_id" : "KNa7z4IBnZsIFAhknfdf",
"_score" : null,
"_source" : {
"id" : 1,
"place" : "낙동강",
"reviews" : "오리알"
},
"sort" : [
"1",
"낙동강"
]
},
{
"_index" : "after_test",
"_type" : "_doc",
"_id" : "S9a7z4IBnZsIFAhkuPfn",
"_score" : null,
"_source" : {
"id" : 2,
"place" : "한강",
"reviews" : "괴물"
},
"sort" : [
"2",
"한강"
]
}
]
}
각 도큐먼트 htis 맨 마지막에 sort 가 나온다. 각 도큐먼트가 sort된느 기준에 해당하는 값을 배열 안에 담아 반환한다.
이 정보 (조회가 어디서 끝났는지 가리키는 지표 역할) 을 가지고 다음 쿼리에 넣어주면 된다.
마지막 도큐먼트의 sort는 ["2", "한강"] 이다.
다음 쿼리 search_after에 위의 내용을 넣는다.
GET after_test/_search
{
"size": 2,
"query":{
"match_all": {}
},
"sort": [
{"id": "asc"},
{"place": "desc"}
],
"search_after": [
"2",
"한강"
]
}
결과
"hits" : {
"total" : {
"value" : 5,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "after_test",
"_type" : "_doc",
"_id" : "Uda7z4IBnZsIFAhk1fdJ",
"_score" : null,
"_source" : {
"id" : 3,
"place" : "미시시피강",
"reviews" : "??"
},
"sort" : [
"3",
"미시시피강"
]
},
{
"_index" : "after_test",
"_type" : "_doc",
"_id" : "5Na8z4IBnZsIFAhkXfdb",
"_score" : null,
"_source" : {
"id" : 4,
"place" : "아마존",
"reviews" : "존존"
},
"sort" : [
"4",
"아마존"
]
}
]
}
이렇게 다음 데이터들이 조회된다 ! 굿굿
반응형