Query DSL (Domain Specific Language)는 Elasticsearch에서 검색을 수행하는 데 사용하는 JSON 기반 언어
URI 쿼리 파라미터 방식(?q=user:kim)보다 더 강력하고 복잡한 검색 조건을 구성할 수 있음
컨텍스트 종류
| 컨텍스트 | 설명 |
|---|---|
query | _score를 계산하여 결과를 정렬함 (자유 텍스트 검색에 사용) |
filter | score 계산 없이 조건 매칭만 수행. 빠르고 캐시 가능함 |
: 색인 시 사용한 analyzer를 기준으로 분석된 텍스트를 검색
match: 분석된 토큰 단위로 OR 검색match_phrase: 단어 순서 포함한 문장 검색query_string: Lucene 문법 기반 고급 검색match_all: 모든 문서 검색
quickORfox에 매칭된 문서 반환GET /books/_search { "query": { "match": { "description": "quick fox" } } }
- 단어 순서 유지, 하나 정도 단어 차이 허용
"match_phrase": { "description": { "query": "quick brown fox", "slop": 1 } }
: 여러 쿼리 조건을 논리적으로 조합
| 키워드 | 설명 |
|---|---|
must | 반드시 만족해야 함 (AND) |
must_not | 제외할 조건 (NOT) |
should | 하나 이상 만족 시 점수 증가 (OR) |
filter | 점수 계산 없이 필터링 (성능 좋음) |
GET /books/_search { "query": { "bool": { "must": [ { "match": { "title": "quick" } } ], "must_not": [ { "match": { "title": "lazy" } } ], "filter": [ { "term": { "status": "published" } } ], "should": [ { "match_phrase": { "title": "quick fox" } } ] } } }
TF-IDF, BM25 등 알고리즘 기반으로 _score를 부여해 정렬됨_score가 높을수록 더 연관성이 높은 문서
- 검색 결과에
_score계산 방식 설명 포함"explain": true
must + should 조합으로 결과를 정렬 기준으로 최적화 가능
category가 electronics인 문서 중 Samsung/LG 포함 문서의_score가 더 높음"bool": { "must": [ { "match": { "category": "electronics" } } ], "should": [ { "match": { "name": "Samsung" } }, { "match": { "name": "LG" } } ] }
: 분석되지 않은 데이터(예: 상태, ID 등)를 정확히 일치시켜 검색
_score 계산 없음 → filter 컨텍스트에 적합
- 분석되지 않은 원본 값에 정확히 매칭되기 위해 사용
"filter": { "term": { "status.keyword": "published" } }
"range": { "age": { "gte": 30, "lt": 40 } }
: 날짜, 숫자 필드에 범위 조건을 적용
"range": { "created_at": { "gte": "2023-01-01", // greater than or equal "lt": "2023-12-31" // less than or equal } }
"range": { "price": { "gte": 10000, "lte": 50000 } }
- 점수 기반 거리 처리
- function_score`와 조합 시, 특정 값에서 가까울수록 높은 점수 부여 가능
- price가 2만 원에 가까울수록 score가 높아지도록 처리
"function_score": {
"query": {
"match": { "category": "electronics" }
},
"functions": [
{
"gauss": {
"price": {
"origin": "20000",
"scale": "10000"
}
}
}
]
}
| 분류 | 목적 및 특징 |
|---|---|
| Full Text Query | 분석된 텍스트 기반 자유 검색 (match, phrase) |
| Bool Query | 논리 조합 (must, should, filter, must_not) |
| Relevancy | TF-IDF/BM25 점수 기반 정렬 |
| Should 조합 | 일부 조건 포함 시 score 증가로 우선 정렬 |
| Exact Value Query | 정확 값 필터링 (ID, 상태 등) |
| Range Query | 숫자/날짜 범위 매칭, _score 미반영 |