엘라스틱서치는 대량의 데이터를 처리하기 위해 기본적으로 데이터를 분산해서 처리한다. 검색요청이 발생하면 엘라스틱서치는 모든 샤드에게 브로드캐스트 방식으로 동시에 요청을 보내고 각각 샤드들이 데이터를 검색한후 결과를 반환하면 엘라스틱서치는 모든 결과를 취합하여 사용자에게 검색 결과를 전달한다. 이러한 동작 방식 때문에 제공되는 부가적인 환경설정값이 있다.

 

동적 분배 방식의 샤드 선택

엘라스틱서치는 부하 분산과 장애처리를 위하여 원본 샤드 + 복제 리플리카 샤드를 운영한다. 물론 원본 샤드와 복제 리플리카 샤드는 각각 다른 노드에 위치하게 된다. 그렇다면 위에서 엘라스틱서치는 검색요청시 모든 샤드에 브로드캐스트 방식으로 검색요청을 보낸다 했는데, 원본 샤드와 복제 리플리카 샤드 두개 모두에게 검색 요청이 갈까? 만약 그렇다면 중복된 답변을 사용자에게 내보낼 것이다. 하지만 엘라스틱서치는 내부적으로 기본 라운드로빈 방식으로 원본,복제 샤드를 번갈아가며 요청을 보낸다. 하지만 이 라운드로빈 방식 이외에도 동적 분배 방식의 알고리즘도 제공한다. 동적 분배 방식은 검색 요청의 응답시간, 검색 요청을 수행하는 스레드 풀의 크기등을 고려해 최적의 샤드를 동적으로 결정하는 방식이다.

 

1
2
3
4
5
6
7
설정) PUT http://localhost:9200/_cluster/settings
 
{
    "transient":{
        "cluster.routing.use_adaptive_replica_selection":true
    }
}
cs

 

글로벌 타임아웃 설정

이전 포스팅에서 쿼리 요청시 응답까지의 타임아웃 설정을 할 수 있다는 것을 다루어봤다. 하지만 모든 쿼리마다 타임아웃 시간을 보내기는 번거로울 수가 있다. 그럴때 사용하는 것이 글로벌 타임아웃 설정이다.

 

 

Elasticsearch - 2.검색 API(Elasticsearch Query DSL)

엘라스틱서치는 인덱스에 저장된 문서를 검색할 수 있도록 다양한 검색기능을 제공한다. 문서는 색인시 설정한 Analyzer에 의해 분석과정을 거쳐 토큰으로 분리되는데, 이러한 Analyzer는 색인 시점 말고도 검색..

coding-start.tistory.com

 

1
2
3
4
5
6
7
설정) PUT http://localhost:9200/_cluster/settings
 
{
    "transient":{
        "search.default_search_timeout":"3s"    
    }
}
cs

 

Count Search API

결과값으로 전문이 아닌 문서 매칭 개수를 알고 싶다면 해당 쿼리를 사용하면 된다.

 

1
2
3
4
5
6
7
8
9
설정) POST http://localhost:9200/movie_search/_count
 
{
    "query":{
        "match":{
            "movieNm":"그대"
        }
    }
}
cs

 

Validate API

작성한 쿼리에 문법적인 오류가 있는지 확인할 수 있는 요청이다.

 

1
2
3
4
5
설정) POST http://localhost:9200/movie_search/_validate/query?rewrite=true
 
{
    "validation 할 쿼리작성"
}
cs

 

Explain API

쿼리 결과로 나온 점수에 대한 상세한 설명이 필요하다면 해당 쿼리를 이용한다.

 

1
2
3
4
5
6
7
8
9
설정) POST http://localhost:9200/movie_search/_doc/문서ID/_explain
 
{
    "query":{
        "term":{
            "typeNm":"장편"
        }
    }
}
cs

 

Profile API

요청한 질의를 실행하는 과정에서 각 샤드별로 얼마나 많은 시간이 소요됐는지의 등의 정보를 각 샤드별로 보고 싶다면 해당 쿼리를 이용한다.

 

1
2
3
4
5
6
7
8
9
10
설정) POST http://localhost:9200/movie_search/_search
 
{
    "profile":true,
    "query":{
        "term":{
            "typeNm":"장편"
        }
    }
}
cs

 

여기까지 일부 환경설정 및 부가적인 쿼리 API에 대해 다루었다. 

posted by 여성게
: