필터 실행edit

앞의 섹션에서는 문서 점수(검색 결과의 _score 필드)라는 세부 사항을 건너뛰었습니다. 이 점수는 해당 문서가 지정된 검색 쿼리와 얼마나 일치하는지를 상대적으로 나타내는 숫자 값입니다. 점수가 높을수록 문서의 연관성이 높아지고 낮을수록 연관성이 떨어집니다.

그러나 쿼리에서 항상 점수를 생성해야 하는 것은 아닙니다. 이를테면 단지 문서 집합을 "필터링"하는 데 쓰이는 경우도 있습니다. Elasticsearch는 이러한 상황을 탐지하여 불필요한 점수를 계산하지 않도록 자동으로 쿼리 실행을 최적화합니다.

앞의 섹션에서 소개한 bool 쿼리filter 절도 지원합니다. 점수 계산 방식을 바꾸지 않고도 쿼리를 사용하여 다른 절과 일치할 문서를 제한할 수 있습니다. 예를 들어 range 쿼리는 값의 범위로 문서를 필터링할 수 있습니다. 주로 숫자 또는 날짜 필터링에 쓰입니다.

이 예는 부울 쿼리를 사용하여 잔액이 20000 ~ 30000의 범위에 속하는 모든 계정을 반환합니다. 즉 잔액이 20000 이상, 30000 이하인 계정을 찾으려 합니다.

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

위 내용을 자세히 살펴보면 부울 쿼리는 match_all 쿼리(쿼리 부분)과 range 쿼리(필터 부분)를 포함하고 있습니다. 이 쿼리 및 필터 부분을 다른 어떤 쿼리로도 대체할 수 있습니다. 위 예에서는 범위 쿼리가 안성맞춤입니다. 범위에 들어가는 문서가 모두 "동등하게" 일치하기 때문입니다. 즉 어떤 문서도 상대적 연관성이 더 높지 않습니다.

match_all, match, bool, range 쿼리 외에도 다양한 쿼리 유형을 사용할 수 있지만 여기서 다루지는 않겠습니다. 이제는 기본 원리를 알고 있으므로 이 지식을 활용하여 어렵지 않게 다른 쿼리 유형을 학습하고 시험해볼 수 있습니다.