티스토리 뷰

728x90

이 개념을 이해하지 못하면
Elasticsearch를 비싼 WHERE 절 엔진으로 쓰게 됩니다.
이해하면, Lucene 기반 검색 엔진으로 제대로 쓰게 됩니다.

  • match = 관련도(_score)를 계산하는 검색
  • filter = 조건 만족 여부만 보는 필터

1. match

정의

문서가 검색어와 얼마나 잘 맞는지를 계산하는 쿼리

 
{
  "query": {
    "match": {
      "content": "Shay Banon"
    }
  }
}

실행 방식

  • text 필드 기준
  • 분석기(analyzer)로 토큰화
  • _score 계산
  • 결과는 관련도 순 정렬

내부 동작

  • Elasticsearch
    Apache LuceneBM25 알고리즘으로 점수를 계산합니다.
  • 즉, “같다 / 다르다”가 아니라 “얼마나 비슷한가”를 계산합니다.

언제 쓰는가

  • 검색창
  • 자연어 검색
  • “비슷한 문서”, “의미 기반 검색”이 필요한 경우

2.  filter

정의

문서가 조건을 만족하느냐 / 아니냐만 판단하는 쿼리

 
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "status.keyword": "PUBLISHED" } },
        { "range": { "publish_date": { "gte": "2018-01-01" } } }
      ]
    }
  }
}

실행 방식

  • 점수 계산 없음
  • 결과는 true / false
  • 캐시 가능
  • 빠름

언제 쓰는가

  • 상태값 (status, type)
  • 날짜, 숫자 범위
  • 체크박스, 드롭다운 UI 조건
  • “정확히 일치해야 하는 값”

3. 핵심 차이 한 눈에 보기

구분 match filter
목적 관련도 기반 검색 조건 필터링
_score 있음 없음
분석(analyze) O X (보통)
정렬 score 기준 별도 지정
캐시
역할 검색 엔진 DB WHERE 절

4. 왜 굳이 나눠놨을까

❌ 전부 match로 쓰면

{
  "query": {
    "match": {
      "status": "PUBLISHED"
    }
  }
}
  • 의미 없는 score 계산
  • 캐시 불가
  • 성능 저하
  • Elasticsearch를 비효율적인 DB처럼 사용

❌ 전부 filter로 쓰면

{
  "query": {
    "bool": {
      "filter": [
        { "term": { "content": "Shay Banon" } }
      ]
    }
  }
}
  • 자연어 검색 불가
  • 관련도 개념 소멸
  • 검색 품질 붕괴

5. 실무·시험 공통 정답 패턴

검색어 = match
조건 = filter

 
{
  "query": {
    "bool": {
      "must": [
        { "match": { "content": "Shay Banon" } }
      ],
      "filter": [
        { "term": { "status.keyword": "PUBLISHED" } },
        { "range": { "publish_date": { "gte": "2018-01-01" } } }
      ]
    }
  }
}
  • match → 점수 계산
  • filter → 결과 범위 제한
  • 가장 흔하고, 가장 안전한 실무 구조

최종 요약

  • match는 “얼마나 잘 맞는가”
  • filter는 “맞냐 아니냐”

이 기준으로 보면,
Elasticsearch를 검색 엔진으로 쓰고 있는지,
아니면 DB 필터로 낭비하고 있는지가 바로 보입니다.


728x90