devljy 2024. 10. 31. 10:31
1. 전문 검색 쿼리 (Full text queries)
// match: 기본 전문 검색. 텍스트를 분석하고 관련 문서를 찾음
{
  "query": {
    "match": {
      "title": "elasticsearch guide" // "elasticsearch" 또는 "guide" 포함
    }
  }
}

// match_phrase: 정확한 구문 검색. 단어 순서도 중요
{
  "query": {
    "match_phrase": {
      "title": "elasticsearch guide" // "elasticsearch guide" 정확히 이 순서로
    }
  }
}

// multi_match: 여러 필드에서 동시 검색
{
  "query": {
    "multi_match": {
      "query": "elasticsearch",
      "fields": ["title", "description"] // title이나 description에서 검색
    }
  }
}

// query_string: 복잡한 검색 조건을 문자열로 표현 (AND, OR, NOT 사용 가능)
{
  "query": {
    "query_string": {
      "query": "(elasticsearch AND guide) OR tutorial"
    }
  }
}

 

 

2. 정확값 쿼리 (Term level queries)
// term: 정확히 일치하는 값 검색 (분석하지 않음)
{
  "query": {
    "term": {
      "status": "active" // status가 정확히 "active"인 경우만
    }
  }
}

// terms: 여러 정확한 값 중 하나와 일치
{
  "query": {
    "terms": {
      "status": ["active", "pending"] // active나 pending 중 하나
    }
  }
}

// range: 범위 검색
{
  "query": {
    "range": {
      "age": {
        "gte": 20,  // 20 이상
        "lte": 30   // 30 이하
      }
    }
  }
}

// exists: 필드가 존재하는지 확인
{
  "query": {
    "exists": {
      "field": "phone_number" // phone_number 필드가 있는 문서
    }
  }
}

// prefix: 특정 접두어로 시작하는 값 검색
{
  "query": {
    "prefix": {
      "title": "elastic" // "elastic"으로 시작하는 값
    }
  }
}

 

 

3. 복합 쿼리 (Compound queries)
// bool: 여러 쿼리 조건을 조합
{
  "query": {
    "bool": {
      "must": [        // 반드시 만족해야 함
        { "match": { "title": "elasticsearch" } }
      ],
      "must_not": [    // 반드시 만족하지 말아야 함
        { "match": { "status": "deleted" } }
      ],
      "should": [      // 있으면 좋음 (점수에 영향)
        { "match": { "category": "database" } }
      ],
      "filter": [      // 반드시 만족 (점수 영향 없음)
        { "range": { "price": { "gte": 10 } } }
      ]
    }
  }
}

// dis_max: 여러 쿼리 중 가장 높은 점수를 선택
{
  "query": {
    "dis_max": {
      "queries": [
        { "match": { "title": "Search" }},
        { "match": { "content": "Search" }}
      ],
      "tie_breaker": 0.3  // 다른 매칭의 점수도 일부 반영
    }
  }
}

 

 

4. 조인 쿼리 (Joining queries)
// nested: 중첩된 객체 내부 검색
{
  "query": {
    "nested": {
      "path": "comments",    // 중첩된 필드 경로
      "query": {
        "bool": {
          "must": [
            { "match": { "comments.author": "john" } }
          ]
        }
      }
    }
  }
}

// has_child: 자식 문서 조건으로 부모 검색
{
  "query": {
    "has_child": {
      "type": "comment",    // 자식 문서 타입
      "query": {
        "match": {
          "content": "elasticsearch"
        }
      }
    }
  }
}

 

 

5. 지리정보 쿼리 (Geo queries)
// geo_distance: 특정 위치에서의 거리 기반 검색
{
  "query": {
    "geo_distance": {
      "distance": "12km",    // 반경 12km 내
      "location": {
        "lat": 40,          // 위도
        "lon": -70          // 경도
      }
    }
  }
}

// geo_bounding_box: 지정된 사각형 영역 내 검색
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {      // 왼쪽 위 좌표
          "lat": 40.73,
          "lon": -74.1
        },
        "bottom_right": {  // 오른쪽 아래 좌표
          "lat": 40.01,
          "lon": -71.12
        }
      }
    }
  }
}

 

 

6. 특수 쿼리 (Specialized queries)
// more_like_this: 유사 문서 검색
{
  "query": {
    "more_like_this": {
      "fields": ["title", "description"],  // 비교할 필드들
      "like": "Elasticsearch is fast",     // 이와 유사한 문서 검색
      "min_term_freq": 1,                  // 최소 단어 빈도
      "max_query_terms": 12                // 최대 검색 텀 수
    }
  }
}

// script_score: 스크립트로 점수 계산
{
  "query": {
    "script_score": {
      "query": { "match_all": {} },
      "script": {
        "source": "doc['price'].value * _score"  // 가격과 점수를 곱함
      }
    }
  }
}