Elasticsearch SQL 쿼리 완벽 가이드

핵심 개념

  1. 인덱스 ↔ 테이블: Elasticsearch 인덱스는 SQL에서 데이터베이스 테이블과 동일합니다.
  2. 문서 ↔ 행: 인덱스 내 문서는 테이블의 한 행(row)에 해당합니다.
  3. 필드 ↔ 열: 문서의 필드는 테이블의 열(column)과 같습니다.
  4. 매핑 ↔ 스키마: text, keyword, long, date 등 필드 데이터 타입은 매핑으로 정의되며, 이는 데이터베이스 스키마에 대응됩니다.

방법 1: SQL REST API 사용 (가장 일반적)

_sql 엔드포인트로 HTTP 요청을 보내는 가장 간단한 방식입니다.

기본 형식

POST /_sql?format=<format>
{
  "query": "SELECT * FROM library ORDER BY page_count DESC LIMIT 5"
}

파라미터 설명

  • format: 응답 데이터 형식을 지정합니다. 주요 값은 다음과 같습니다.
    • json (기본값)
    • csv
    • txt (텍스트 테이블 형태, 가독성 최고)
    • tsv
    • yaml
  • query: 실행할 SQL 문장 문자열입니다.

예제

book_index라는 인덱스에 도서 정보가 저장되어 있다고 가정합니다.

1. 기본 조회

# 전체 필드 조회 (상위 10개 레코드)
POST /_sql?format=txt
{
  "query": "SELECT * FROM book_index"
}

# 특정 필드 조회
POST /_sql?format=txt
{
  "query": "SELECT title, author, price FROM book_index"
}

2. WHERE 조건 필터링

# 저자가 '조지 R.R. 마틴'인 책 검색
POST /_sql?format=txt
{
  "query": "SELECT title, price FROM book_index WHERE author = '조지 R.R. 마틴'"
}

# 가격이 20보다 큰 책 검색
POST /_sql?format=txt
{
  "query": "SELECT title, price FROM book_index WHERE price > 20"
}

# AND/OR 사용
POST /_sql?format=txt
{
  "query": "SELECT title, price FROM book_index WHERE price > 20 AND author LIKE '%마틴%'"
}

3. 집계 쿼리 (GROUP BY)

# 저자별 책 권수
POST /_sql?format=txt
{
  "query": "SELECT author, COUNT(*) as book_count FROM book_index GROUP BY author"
}

# 저자별 평균 책 가격
POST /_sql?format=txt
{
  "query": "SELECT author, AVG(price) as avg_price FROM book_index GROUP BY author"
}

4. 정렬 및 페이징 (ORDER BY & LIMIT)

# 가격 내림차순, 상위 5권
POST /_sql?format=txt
{
  "query": "SELECT title, author, price FROM book_index ORDER BY price DESC LIMIT 5"
}

# 페이징 (LIMIT <size> OFFSET <offset>)
POST /_sql?format=txt
{
  "query": "SELECT title, price FROM book_index ORDER BY price DESC LIMIT 10 OFFSET 10"
}

5. 날짜 범위 조회
pub_date 필드가 date 타입이라고 가정합니다.

# 2020년 이후 출판된 책 검색
POST /_sql?format=txt
{
  "query": "SELECT title, pub_date FROM book_index WHERE pub_date > '2020-01-01'"
}

방법 2: Translate API 사용

SQL 문이 어떤 Elasticsearch 쿼리 DSL로 변환되는지 확인하려면 Translate API를 사용합니다.

POST /_sql/translate
{
  "query": "SELECT author, COUNT(*) FROM book_index GROUP BY author"
}

Elasticsearch는 변환된 ES DSL 쿼리를 JSON으로 반환하며, 학습 및 디버깅에 유용합니다.

방법 3: Kibana에서 사용

Kibana는 Elasticsearch SQL 쿼리를 실행할 수 있는 통합 인터페이스를 제공합니다.

  1. Kibana를 엽니다.
  2. 왼쪽 탐색 메뉴에서 Management > Dev Tools로 이동합니다.
  3. Console 탭에서 REST API 요청을 직접 입력합니다.

또한 Kibana의 Discover 기능에서 "Use SQL" 옵션을 선택해 SQL 모드로 전환하여 조회 및 시각화를 수행할 수 있습니다.

중요 주의사항 및 제한 사항

  1. 필드 타입과 SQL 타입: Elasticsearch의 text 필드는 기본적으로 토큰화되어(전문 검색용) 사용되며, keyword 필드는 정확한 일치와 집계에 사용됩니다. SQL 쿼리에서 text 필드에 대해 GROUP BY= 필터를 사용하면 실패할 수 있으므로, 보통 keyword 하위 필드(예: fieldname.keyword)를 사용해야 합니다.

    • 잘못된 예: SELECT * FROM book_index WHERE title = '빠른 갈색 여우' (title이 text 타입이면 검색되지 않을 수 있음)
    • 올바른 예: SELECT * FROM book_index WHERE title.keyword = '빠른 갈색 여우'
  2. 인덱스 패턴: FROM 절은 와일드카드로 여러 인덱스를 매칭할 수 있으며, SQL의 테이블 패턴 매칭과 유사합니다.

    • FROM logstash-2023.10.*
    • FROM book_index, other_index
  3. 지원되지 않는 기능:

    • DELETE / UPDATE: Elasticsearch SQL은 주로 조회용이며 DELETE, UPDATE, INSERT와 같은 DML(데이터 조작 언어)을 지원하지 않습니다. 데이터 변경은 인덱스/업데이트 API를 사용해야 합니다.
    • JOIN: 인덱스 간 JOIN을 지원하지 않으며, 모든 데이터는 단일 인덱스(또는 동일 매핑의 여러 인덱스)에서 가져와야 합니다.
    • 저장 프로시저/트랜잭션: 데이터베이스 트랜잭션이나 저장 프로시저를 지원하지 않습니다.
  4. 성능: 매우 복잡한 집계 및 쿼리의 경우 네이티브 DSL이 더 많은 최적화 옵션을 제공할 수 있습니다. 하지만 대부분의 일반적인 시나리오에서 SQL의 성능은 충분히 우수하며, 가독성 측면에서 큰 장점이 있습니다.

요약

특성 설명
장점 학습 비용이 낮고, SQL에 익숙한 사용자에게 매우 친숙하며, 쿼리가 간결하고 명확합니다.
적합한 시나리오 임시 조회(Ad-hoc), 데이터 탐색, 보고서 생성, SQL로 빠른 프로토타입 개발이 필요한 경우.
부적합한 시나리오 데이터 업데이트/삭제, 인덱스 간 조인, 매우 저수준의 Elasticsearch 고유 기능이 필요한 경우.
핵심 방법 POST /_sql?format=txt REST API 사용.
주요 도구 cURL, Kibana Console, 모든 HTTP 클라이언트.

Elasticsearch SQL을 사용하면 Elasticsearch 데이터를 훨씬 간단하게 조회할 수 있으며, 복잡한 쿼리 문법 대신 데이터 자체에 집중할 수 있습니다.

태그: elasticsearch SQL REST API Kibana 쿼리

5월 27일 20:00에 게시됨