Query DSL — bool 쿼리와 must/filter 컨텍스트
Elasticsearch 공식 문서(elastic.co/docs) 및 기술 블로그 종합 — 아키텍처부터 운영까지 (웹 리서치, 2026) — Elastic 공식 문서 + 여러 기술 블로그(Opster, Baeldung 등) 교차 확인
이 모듈을 다 읽으면
- bool 쿼리의 must/filter/should/must_not 네 절이 각각 무엇을 하는지 구분할 수 있다
- query context와 filter context의 차이(스코어링 여부, 캐싱 여부)를 설명할 수 있다
- filter로 바꿔야 하는 상황과 must를 유지해야 하는 상황을 판단할 수 있다
bool 쿼리의 절 구성과, query context(스코어링 O)와 filter context(스코어링 X, 캐시 가능)의 실무적 차이를 정리한다.
bool 쿼리 — 여러 조건을 조합하는 기본 틀
bool 쿼리는 must(반드시 만족, 관련도 점수에 반영), filter(반드시 만족, 점수에 반영 안 함), should(만족하면 점수 가산, bool 안에 must/filter가 없으면 최소 하나는 만족해야 함), must_not(만족하면 제외) 네 가지 절을 조합한다. 예를 들어 '카테고리가 electronics이고, 제목에 laptop이 포함되며, 가격이 100만원 이하'라는 조건은 카테고리·가격은 filter로(참/거짓만 중요), 제목 검색은 must로(관련도 순위가 중요) 넣는 식으로 나눠 쓴다.
핵심 포인트
- must: 필수 + 점수 반영 / filter: 필수 + 점수 미반영 / should: 가산점(단독이면 최소 하나 필요) / must_not: 제외
- 관련도 순위가 중요한 조건은 must, 참/거짓만 중요한 조건(정확 매칭, 범위 등)은 filter로 나눠 쓴다
query context vs filter context — 스코어링과 캐싱의 차이
query context(must, should)에서 실행된 절은 '이 문서가 조건에 얼마나 잘 맞는가'를 계산해 관련도 점수(_score)에 반영한다. filter context(filter, must_not)에서 실행된 절은 참/거짓만 따지고 점수 계산을 생략하므로 더 빠르며, 게다가 Elasticsearch가 filter의 결과를 노드별 쿼리 캐시에 저장해 같은 필터가 반복 사용될 때(예: 같은 날짜 범위나 같은 상태값으로 계속 필터링) 재사용할 수 있다. 그래서 정확 매칭·범위·존재 여부처럼 '점수가 필요 없는' 조건은 must 대신 filter로 옮기는 것이 표준적인 성능 최적화다 — 점수 계산을 건너뛰고, 캐시 재사용 가능성까지 얻는다.
핵심 포인트
- query context(must/should)는 스코어링 계산 O, filter context(filter/must_not)는 스코어링 계산 X(더 빠름)
- filter의 결과는 노드별 쿼리 캐시에 저장돼 반복 사용 시 재사용된다
- 점수가 필요 없는 조건(정확 매칭, 범위, 존재 여부 등)을 must에서 filter로 옮기는 게 표준적인 성능 최적화