(ElasticSearch) 라우팅

자식 문서가 부모 문서와 같은 샤드에 있는 것이, 다른 샤드에 있을 때 보다 검색 성능이 더 좋을 것이다.
라우팅이란 이처럼 문서를 특정 샤드에 위치시킬 수 있는 역할을 한다.

보통 색인시 문서의 ID값을 해싱하여 해당 문서를 샤드에 색인하게 된다.

하지만 라우팅 값을 이용하면 해당 routing값을 해싱하여 샤드에 색인하게 된다.



1. 왜 라우팅을 사용해야 하는가?


라우팅을 사용하지 않을 경우, 엘라스틱서치는 문서를 여러 샤드들에 균등하게 분포시킬 것이다.
그렇다면 왜 라우팅을 사용해야 할까?

그 이유는 커스텀 라우팅은 같은 라우팅 값을 공유하는 문서들을 한 샤드에 저장할 수 있도록 하기 때문이다.
이 문서들이 같은 색인에 존재할 경우, 쿼리에 라우팅 값을 지정하여 요청이 색인의 특정 샤드들에 대해서만 수행되도록 할 수 있다.


1-1. 라우팅 전략

라우팅은 두 가지 영역에서의 고민이 필요하다.
먼저 문서를 색인하는 시점에 좋은 적절한 라우팅 값을 선택해야 하고, 쿼리 시점에 이를 재활용 할 수 있어야 한다.
만약 적은 분포를 가지는 다른 값을 라우팅 값으로 선택하고자 했다면, 색인 내의 샤드 간에 불균등한 분포를 이루게 될수 있다.
만약 라우팅 값의 경우의 수가 세 가지뿐이라면, 모든 문서들은 최대 세개의 샤드에 걸쳐 분포하게 될 것이다.
색인 내의 여러 샤드에 걸쳐 데이터를 분포 시키기 위해서는 충분히 많은 카디널리티를 가지는 값을 라우팅 필드로 선택하는 것이 상당히 중요하다고 볼 수 있다.


예)

POST get-together/group/10?routing=denver
{
  "name" : "Denver Ruby",
  "description" : "The Denver Ruby Meetup"
}


POST get-together/group/11?routing=boulder
{
  "name" : "Boulder Ruby",
  "description" : "Boulderites that use Ruby"
}

POST get-together/group/12?routing=amsterdam
{
  "name" : "Amsterdam Ruby",
  "description" : "Amsterdam that use Ruby"
}



이때, denver와 amsterdam의 샤드만 반환 하려면 다음과 같다.

POST get-together/group/_search?routing=denver,amsterdam
{
  "query" : {
    "match" : {
      "name" : "ruby"
    }
  }
}




댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기