Query DSL
원본 보기Query DSL
Query DSL은 복잡한 검색, 필터링 및 집계를 지원하는 모든 기능을 갖춘 JSON 스타일 쿼리 언어입니다. 현재 Elasticsearch에서 가장 먼저 도입되었으며 가장 강력한 쿼리 언어입니다.
_search 엔드포인트는 Query DSL 구문으로 작성된 쿼리를 받습니다.
Query DSL은 다음을 비롯한 다양한 검색 기법을 지원합니다.
- 전체 텍스트 검색: 구문 또는 근접 쿼리, 퍼지 일치 등을 지원하도록 분석하고 인덱싱한 텍스트를 검색합니다.
- 키워드 검색:
keyword필드를 사용하여 정확히 일치하는 항목을 검색합니다. - 시맨틱 검색: Elasticsearch 클러스터에서 생성된 임베딩에 대해 밀집 또는 희소 벡터 검색을 사용하여
semantic_text필드를 검색합니다. - 벡터 검색: Elasticsearch 외부에서 생성된 임베딩에 kNN 알고리즘을 사용하여 유사한 밀집 벡터를 검색합니다.
- 지리 공간 검색: 지리 공간 쿼리를 사용하여 위치를 검색하고 공간 관계를 계산합니다.
Query DSL을 사용하여 데이터를 필터링할 수도 있습니다. 필터를 사용하면 특정 필드 수준 조건과 일치하는 문서를 가져와 문서를 포함하거나 제외할 수 있습니다. filter 매개변수를 사용하는 쿼리는 필터 컨텍스트를 나타냅니다.
집계는 Query DSL을 사용하여 Elasticsearch 데이터를 분석하는 기본 도구입니다. 집계를 사용하면 데이터의 복잡한 요약을 만들고 주요 메트릭, 패턴 및 추세에 대한 인사이트를 얻을 수 있습니다.
집계는 검색에 사용되는 것과 동일한 데이터 구조를 활용하므로 속도도 매우 빠릅니다. 따라서 데이터를 실시간으로 분석하고 시각화할 수 있습니다. 한 번의 요청으로 동일한 데이터에 대해 문서를 검색하고 결과를 필터링하며 동시에 분석을 수행할 수 있습니다. 즉, 집계는 검색 쿼리의 컨텍스트에서 계산됩니다.
다음 집계 유형을 사용할 수 있습니다.
- 메트릭: 필드 값에서 합계나 평균 같은 메트릭을 계산합니다.
- 버킷: 필드 값, 범위 또는 기타 조건에 따라 문서를 버킷으로 그룹화합니다.
- 파이프라인: 다른 집계 결과에 대해 집계를 실행합니다.
검색 API의 aggs 매개변수를 지정하여 집계를 실행합니다. 자세한 내용은 집계 실행을 참조하세요.
Query DSL을 두 가지 유형의 절로 구성된 쿼리의 AST(추상 구문 트리)라고 생각할 수 있습니다.
리프 쿼리 절: 리프 쿼리 절은 match, term 또는 range 쿼리처럼 특정 필드에서 특정 값을 찾습니다. 이러한 쿼리는 단독으로 사용할 수 있습니다.
복합 쿼리 절: 복합 쿼리 절은 다른 리프 또는 복합 쿼리를 감싸며, 여러 쿼리를 논리적인 방식으로 결합하거나(bool 또는 dis_max 쿼리 등) 동작을 변경하는 데(constant_score 쿼리 등) 사용됩니다.
쿼리 절은 쿼리 컨텍스트 또는 필터 컨텍스트 중 어디에 사용되는지에 따라 다르게 동작합니다.
비용이 많이 드는 쿼리 허용: 특정 유형의 쿼리는 구현 방식으로 인해 일반적으로 실행 속도가 느리며, 이는 클러스터 안정성에 영향을 줄 수 있습니다. 이러한 쿼리는 다음과 같이 분류할 수 있습니다.
일치 항목을 식별하기 위해 선형 스캔을 수행해야 하는 쿼리:
초기 비용이 많이 드는 쿼리:
문서당 비용이 많이 들 수 있는 쿼리:
search.allow_expensive_queries 설정 값을 false로 지정하면 이러한 쿼리의 실행을 방지할 수 있습니다(기본값은 true).
기본적으로 Elasticsearch는 각 문서가 쿼리와 얼마나 잘 일치하는지를 측정하는 관련성 점수를 기준으로 일치하는 검색 결과를 정렬합니다.
관련성 점수는 양의 부동 소수점 숫자로, _score 메타데이터 필드를 통해 검색 API에서 반환됩니다. _score가 높을수록 문서의 관련성이 높습니다. 쿼리 유형마다 관련성 점수를 다르게 계산할 수 있지만, 점수 계산은 쿼리 절이 쿼리 또는 필터 컨텍스트 중 어디에서 실행되는지에 따라서도 달라집니다.
쿼리 컨텍스트에서 쿼리 절은 이 문서는 이 쿼리 절과 얼마나 잘 일치하는가?라는 질문에 답합니다. 쿼리 절은 문서의 일치 여부를 결정할 뿐만 아니라 _score 메타데이터 필드에 관련성 점수도 계산합니다.
쿼리 컨텍스트는 쿼리 절이 query 매개변수에 전달될 때마다 적용됩니다. 그 예로 query 매개변수가 있는 검색 API가 있습니다.
필터는 “이 문서가 이 쿼리 절과 일치하는가?”라는 이진 질문에 답합니다. 답은 단순히 "예" 또는 "아니요"입니다. 필터링에는 다음과 같은 여러 이점이 있습니다.
- 단순한 이진 논리: 필터 컨텍스트에서 쿼리 절은 점수를 계산하지 않고 예/아니요 조건에 따라 문서의 일치 여부를 결정합니다.
- 성능: 필터는 관련성 점수를 계산하지 않으므로 쿼리보다 빠르게 실행됩니다.
- 캐싱: Elasticsearch는 자주 사용하는 필터를 자동으로 캐시하여 이후 검색 성능을 높입니다.
- 리소스 효율성: 필터는 전체 텍스트 쿼리보다 CPU 리소스를 적게 사용합니다.
- 쿼리 결합: 필터를 점수가 계산되는 쿼리와 결합하여 결과 집합을 효율적으로 구체화할 수 있습니다.
필터는 구조화된 데이터를 쿼리하고 복잡한 검색에서 "필수" 조건을 구현할 때 특히 효과적입니다.
구조화된 데이터란 미리 정의된 방식으로 체계적으로 구성되고 형식이 지정된 정보를 의미합니다. Elasticsearch 컨텍스트에서는 일반적으로 다음이 포함됩니다.
- 숫자 필드(정수, 부동 소수점 숫자)
- 날짜 및 타임스탬프
- 부울 값
- 키워드 필드(정확히 일치하는 문자열)
- 지리적 점 및 지리적 도형
전체 텍스트 필드와 달리 구조화된 데이터는 일관되고 예측 가능한 형식을 가지므로 정밀한 필터링 작업에 적합합니다.
일반적인 필터 적용 사례는 다음과 같습니다.
- 날짜 범위 확인: 예를 들어
timestamp필드가 2015년과 2016년 사이인지 확인 - 특정 필드 값 확인: 예를 들어
status필드가 "published"와 같은지 또는author필드가 "John Doe"와 같은지 확인
필터 컨텍스트는 다음과 같이 쿼리 절이 filter 매개변수에 전달될 때 적용됩니다.
filter또는must_not매개변수:bool쿼리에서 사용filter매개변수:constant_score쿼리에서 사용filter집계
필터는 특히 구조화된 데이터 쿼리와 전체 텍스트 검색을 결합할 때 쿼리 성능과 효율성을 최적화합니다.
다음은 search API에서 쿼리 절을 쿼리 및 필터 컨텍스트에 사용하는 예시입니다. 이 쿼리는 다음 조건을 모두 충족하는 문서와 일치합니다.
title필드에search라는 단어가 포함되어 있습니다.content필드에elasticsearch라는 단어가 포함되어 있습니다.status필드에 정확히published라는 단어가 포함되어 있습니다.publish_date필드에 2015년 1월 1일 이후의 날짜가 포함되어 있습니다.
GET /_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
query매개변수는 쿼리 컨텍스트를 나타냅니다.bool및 두 개의match절은 쿼리 컨텍스트에서 사용됩니다. 즉, 각 문서가 얼마나 잘 일치하는지 점수를 계산하는 데 사용됩니다.filter매개변수는 필터 컨텍스트를 나타냅니다. 이 매개변수의term및range절은 필터 컨텍스트에서 사용됩니다. 일치하지 않는 문서는 걸러내지만 일치하는 문서의 점수에는 영향을 주지 않습니다.
쿼리 컨텍스트의 쿼리에 대해 계산된 점수는 단정밀도 부동 소수점 숫자로 표현되며, 가수 정밀도는 24비트뿐입니다. 가수 정밀도를 초과하는 점수 계산 결과는 정밀도 손실이 있는 부동 소수점 값으로 변환됩니다.
일치하는 문서의 점수(즉, 문서가 얼마나 잘 일치하는지)에 영향을 주어야 하는 조건에는 쿼리 컨텍스트의 쿼리 절을 사용하고, 그 밖의 모든 쿼리 절에는 필터 컨텍스트를 사용하세요.