본문 바로가기

Elasticsearch

[elasticsearch] search after란? 사용 방법 알아보기 with node.js

반응형

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",
          "아마존"
        ]
      }
    ]
  }

 

이렇게 다음 데이터들이 조회된다 !  굿굿 

반응형