Elastic Search

Ch04. 데이터 검색 - 부가적인 검색 API

webmaster 2025. 9. 14. 18:01
728x90

엘라스틱 서치는 대량의 데이터를 처리하기 위해 기본적으로 데이터를 분산 처리 하며, 빠른 검색을 위해 내부적으로 요청이 발생하면 모든 샤드에 검색 요청을 브로드 캐스팅 전달하고 기다린다. 각 샤드는 자신이 가지고 있는 데이터를 기준으로 검색을 수행하고 그 결과를 반환하게 되며, 모든 샤드로부터 검색 결과가 도착하면 도착한 모든 결과를 조합해서 최종 질의 결과를 출력한다.

동적 분배 방식의 샤드 선택

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.use_adaptive_replica_selection": true
  }
}
  • 엘라스틱서치는 부하 분산과 장애 극복을 위해 원본 샤드의 데이터를 복제한 레플리카 샤드를 함께 운영하는데, 검색 시 모든 샤드에서 검색을 수행하게 된다면 사용자에게 중복 데이터를 전달할 것이다. -> 엘라스틱서치는 검색을 수행할 때 동일 데이터를 가지고 있는 샤드 중 하나만 선택해 검색을 수행한다.
  • 설정을 하지 않았을 경우 라운드 로빈 알고리즘 사용
    • 순차적으로 샤드를 선택
  • 동적 분배 방식은 검색 요청의 응답 시간, 검색 요청을 하는 스레드 풀의 크기 등을 고려해 최적의 샤드를 동적으로 결정하는 방식이다.

글로벌 타임아웃 설정

PUT _cluster/settings
{
  "transient": {
    "search.default_search_timeout": "1s"
  }
}
  • 개별 검색 요청의 경우에는 Request Body에 직접 타임아웃을 설정할 수도 있지만, 모든 검색 쿼리에 동일하게 적용되도록 설정할 수도 있다.
  • 글로벌로 적용되는 타임아웃의 기본 정책은 무제한(-1)이다.

Search Shards API

POST movie_search/_search_shards
  • Search Shards API를 이용해 검색이 수행되는 노드 및 샤드에 대한 정보를 알 수 있다.
  • 질의 최적화, 질의가 오류가 발생할 때 문제를 해결하는데 유용하게 사용할 수 있다.

Multi Search API

POST _msearch
{"index" : "movie_auto"}
{"query" : ("match_all" : (l}, "from" : 0, "size": 10}
("index" : "movie_search"}
("query" : {"match_all" : (lY, "from" : 0, "size" : 10}
  • 여러건의 검색 요청을 통합해서 한 번에 요청하고 한 번에 결과를 종합해서 받을 때 사용하는 API다.
  • 동시에 여러 개의 색인에서 검색을 수행할 수 있으므로 사용자별 맞춤 페이지 등을 구현할 때, 여러 인덱스에서 사용자별 특화된 정보를 가져올 때 유용하다.

Count API

URI 검색

POST movie_search/_count?q=prdtYear: 2017

RequestBody 검색

POST movie_search/_count
{
  "query": {
    "query_string": {
      "default_field": "prdtYear",
      "query": "2017"
    }
  }
}
  • CountAPI를 이용하면 검색된 문서의 갯수만 가지고 올 수 있다. 

Validate API

URI 검색

POST movie_ search/_validate/query?@=prdtYear:2017

RequestBody 검색

//POST movie_search/_validate/query
POST movie_search/_validate/query?rewrite=true
{
  "query": {
    "match": {
      "prdtYear": 2017
    }
  }
}
  • Validate API를 통해 쿼리가 실행하기 전에 쿼리가 유효하게 작성되었는지 검증하는 것이 가능하다.
  • 쿼리가 오류가 발생할 경우 Valid값이 false로만 리턴되는데, 쿼리가 실패한 원인을 알고 싶을 경우에는 요청 URL 파라미터로 rewrite=true를 추가하면 된다.

ExplainAPI

POST movie_search/_explain/8
{
  "query": {
    "term": {
      "prdtYear": 2017
    }
  }
}
  • _score를 통해 검색한 키워드와 검색 결과가 얼마나 유사한지 확인할 수 있는데, _Score가 어떻게 계산이 된 것인지 알고 싶다면 ExplainAPI를 호출하면 된다.

Profile API

POST movie_search/_search
{
  "profile": true,
  "query": {
    "match_all": {}
  }
}
  • ProfileAPI는 쿼리에 상세한 수행 계획과 각 수행 계획별로 수행된 시간을 돌려주므로 성능을 뷰닝하거나, 디버깅할 때 유용하다.
  • 단, 사용할 때 반드시 ProfileAPI 결과가 매우 상세히 설명되어 결과가 매우 크다.
    • 특히 여러 샤드 걸쳐 검색되는 경우 더욱 결과값이 길어지기 때문에 확인하기 어렵다.
    • 샤드별 몇건의 문서가 매칭되었고, 검색을 수행한 시간이 어떤지에 대한 정보가 상세히 제공
  • 내 질의를 실행하는 과정에 각 샤드별 수행 시간을 알고 싶다면 ProfileAPI를 사용하자 
728x90