쿼리 DSL (Query DSL) 활용
📌 Elasticsearch의 Query DSL(Domain-Specific Language)은 강력한 검색 기능을 제공하는 JSON 기반의 검색 언어입니다.
- 다양한 검색 쿼리를 조합하여 원하는 데이터를 빠르게 찾을 수 있음.
- 기본적인 Match, Term, Bool, Range, Multi-Match 쿼리를 활용할 수 있음.
- Aggregation(집계) 기능을 사용하여 데이터 분석 가능.
Match Query vs Term Query 차이점
쿼리 유형 | 설명 | 적용 대상 필드 | 형태소 분석 |
Match Query | 형태소 분석을 적용한 검색 (전문 검색) | text 타입 | O |
Term Query | 정확한 값 일치 검색 | keyword, integer, boolean | X |
✅ (1) Match Query (전문 검색)
- text 필드에 대해 형태소 분석을 수행하여 검색.
- 단어가 포함된 문서들을 검색할 때 사용.
GET /products/_search
{
"query": {
"match": {
"name": "Elasticsearch 책"
}
}
}
✅ "name" 필드에서 "Elasticsearch 책"과 관련된 문서 검색.
✅ (2) Term Query (정확한 일치 검색)
- keyword, integer, boolean 타입 필드에 대해 정확한 값 검색.
- 필터링 또는 정렬을 수행할 때 사용.
GET /products/_search
{
"query": {
"term": {
"category": "IT"
}
}
}
✅ "category"가 정확히 "IT"인 문서 검색.
Bool Query (must, should, must_not, filter)
Bool Query는 여러 개의 쿼리를 조합하여 검색할 때 사용합니다.
Bool Query | 옵션 설명 |
must | 모든 조건을 충족하는 문서 (AND 연산) |
should | 하나 이상의 조건을 충족하는 문서 (OR 연산) |
must_not | 해당 조건을 제외 (NOT 연산) |
filter | 조건을 충족하지만 점수(Score)에 영향을 주지 않음 |
✅ (1) Bool Query 예제
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "Elasticsearch" } },
{ "term": { "category": "IT" } }
],
"should": [
{ "match": { "description": "데이터 검색" } }
],
"must_not": [
{ "term": { "stock": false } }
],
"filter": [
{ "range": { "price": { "gte": 20000, "lte": 50000 } } }
]
}
}
}
✅ 설명
- must: "name" 필드에 "Elasticsearch" 포함 + "category"가 "IT"인 문서.
- should: "description"에 "데이터 검색"이 포함되면 점수(Score) 증가.
- must_not: "stock"이 false인 문서는 제외.
- filter: 가격이 20,000 ~ 50,000 범위 내인 문서만 검색 (점수에 영향 없음).
Range Query (숫자, 날짜 검색)
Range Query는 숫자 또는 날짜 필드에 대해 범위 조건 검색을 수행할 때 사용합니다.
✅ (1) 숫자 범위 검색
GET /products/_search
{
"query": {
"range": {
"price": {
"gte": 20000,
"lte": 50000
}
}
}
}
✅ price가 20,000 이상, 50,000 이하인 문서 검색.
✅ (2) 날짜 범위 검색
GET /products/_search
{
"query": {
"range": {
"release_date": {
"gte": "2023-01-01",
"lte": "2023-12-31",
"format": "yyyy-MM-dd"
}
}
}
}
✅ release_date가 2023년 내인 문서 검색.
Multi-Match Query (여러 필드 검색)
Multi-Match Query는 여러 개의 필드에서 동일한 검색어를 찾을 때 사용합니다.
GET /products/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch",
"fields": ["name", "description"]
}
}
}
✅ "name"과 "description" 필드에서 "Elasticsearch" 포함 문서 검색.
Aggregation(집계) 기본
**Aggregation(집계)**는 데이터를 분석하고 요약할 때 사용합니다.
- SQL의 GROUP BY, SUM, AVG와 유사한 기능을 제공.
- 주요 Aggregation 유형
- Bucket Aggregation → 데이터를 그룹화 (terms, histogram 등).
- Metric Aggregation → 평균, 합계 계산 (avg, sum, min, max 등).
- Pipeline Aggregation → 집계 결과를 추가 연산.
✅ (1) 카테고리별 문서 수 집계 (Terms Aggregation)
GET /products/_search
{
"size": 0,
"aggs": {
"category_count": {
"terms": {
"field": "category.keyword"
}
}
}
}
✅ "category" 필드의 각 값별 문서 개수 집계.
🔹 응답 예시
{
"aggregations": {
"category_count": {
"buckets": [
{ "key": "IT", "doc_count": 10 },
{ "key": "Electronics", "doc_count": 5 }
]
}
}
}
✅ "IT" 카테고리에 10개 문서, "Electronics" 카테고리에 5개 문서 존재.
✅ (2) 가격의 평균, 최대, 최소값 집계
GET /products/_search
{
"size": 0,
"aggs": {
"price_stats": {
"stats": {
"field": "price"
}
}
}
}
✅ price 필드의 최소값, 최대값, 평균값 계산.
🔹 응답 예시
{
"aggregations": {
"price_stats": {
"min": 15000,
"max": 60000,
"avg": 37500,
"sum": 150000
}
}
}
쿼리 DSL 활용 정리
쿼리 유형 | 설명 |
Match Query | text 필드 검색 (형태소 분석 적용) |
Term Query | 정확한 일치 검색 (keyword, integer, boolean) |
Bool Query | must, should, must_not, filter 조건 조합 |
Range Query | 숫자 및 날짜 범위 검색 |
Multi-Match Query | 여러 개의 필드에서 검색 |
Aggregation | 데이터 분석 및 요약 |
결론
- Match Query는 형태소 분석을 적용한 검색, Term Query는 정확한 일치 검색.
- Bool Query를 사용하면 복합 검색 가능.
- Range Query는 숫자 및 날짜 검색에 활용.
- Multi-Match Query를 사용하면 여러 필드에서 검색 가능.
- Aggregation을 사용하면 데이터를 그룹화하고 통계 분석 가능.
'Elastic Search' 카테고리의 다른 글
[LV 4] Elasticsearch Scaling (확장 전략) (0) | 2025.02.02 |
---|---|
[LV 3] Ingest Pipeline & Reindex API (0) | 2025.02.02 |
[LV 2] 색인(Indexing)과 검색(Search) 기본 (0) | 2025.02.02 |
[LV 2] 인덱스(Index)와 매핑(Mapping) (0) | 2025.02.02 |
[LV 1] Elasticsearch 설치 및 기본 환경 설정 (1) | 2025.02.01 |