본 포스팅은 2024년 04월 24일, Elasticsearch 8.13 버전 기준으로 작성되었습니다.
ES|QL은 Discover에서 데이터를 더 빠르고 쉽게 탐색하기 위해 추가된 검색 쿼리 중 하나이며, SQL과 유사한 문법을 갖고 있습니다.
FROM employees
| WHERE first_name LIKE "?b*"
| KEEP first_name, last_name
ES|QL REST API을 통해 직접 쿼리를 호출 가능하지만, 주로 Discover의 Filtering 목적으로 쓰입니다.
ES|QL을 통해 하나의 쿼리로 Discover를 벗어나지 않고도 검색, 집계, 계산 및 데이터 변환을 수행할 수 있습니다.
Elasticsearch는 기존에도 다양한 언어들을 지원했습니다.
그럼에도 ES|QL이 등장한 것은 이제 Elasticsearch의 쓰임새가 전문 검색을 넘어 로그 탐색, 위협 헌팅, 리포팅, 알림, 사용자 지정 처리 등의 분야에 사용되기 때문입니다.
사용자들에게 외부 시스템으로 값비싼 전송을 할 필요가 없는 단일되고 통합된 방식으로 Elasticsearch에 접근할 수 있도록 하기 위한 보다 직관적인 언어가 바로 ES|QL입니다.
또한, SQL과 공통된 문법을 사용하므로, 기존 SQL에 친숙한 사용자들이 쉽게 접근할 수 있습니다.
ES|QL은 파이프( | )를 사용해 단계별 방식으로 데이터를 조작하고 변환합니다.
한 작업의 출력 이후 다음 작업의 입력으로 이어지는 일련의 작업을 구성할 수 있어, 기존의 Elasticsearch에서 제공하던 쿼리로는 어렵던 복잡한 데이터 변환과 분석이 가능합니다.
또한, ES|QL의 검색, 집계, 변환 기능은 기타 언어로 바뀌지 않고, 그 자체 내에서 직접 실행됩니다.
Discover 메뉴 내의 Data View 선택 부분에서 Try ES|QL을 클릭합니다.
검색 대상 데이터에 timestamp가 포함되어 있는 경우, 우측 상단의 Time Filter를 확인 후 검색 범위에 맞게 조정합니다.
상단의 Query Bar를 확대하여 ES|QL query를 입력합니다.
(ES|QL 설정 전 이미 되어있던 필터링 설정은 기본 쿼리로 이미 작성되어 있습니다.)
더 쉽게 query를 작성할 수 있도록 각 명령어나 함수의 자동 완성 기능을 제공합니다.
Query 결과에 따라서 상단에 해당 결과에 맞는 시각화를 제공합니다.
시각화 패널 우측 상단의 Save, Edit 버튼을 통해 해당 시각화를 저장, 수정하여 Visualization 패널로 내보낼 수 있습니다.
dev tools에서도 API로 사용할 수 있습니다.
API의 query 내에 ES|QL query를 입력 후 실행합니다.
POST /_query?format=txt
{
"query": """
FROM kibana_sample_data | limit 10
"""
}
SORT 명령어를 통해 하나 이상의 열을 기반으로 행을 정렬할 수 있습니다.
FROM kibana_sample_data_flights
| SORT AvgTicketPrice DESC
WHERE 명령어를 통해 조건을 설정하여 필터링합니다.
FROM kibana_sample_data_flights
| WHERE AvgTicketPrice < 1000
WHERE과 함께 LIKE 연산자를 사용하면 Wildcard 쿼리가 가능합니다.
FROM kibana_sample_data_flights
| WHERE Dest LIKE "London*"
그 외에도 KEEP, DROP 등의 명령어로 테이블의 열을 유지, 삭제하거나, ENRICH 명령어로 elasticsearch의 인덱스 데이터를 테이블에 enrich 하거나, DISSECT, GROK 명령어로 데이터를 가공할 수 있습니다.
자세한 Processing Command에 대한 설명은 이 링크에서 확인할 수 있습니다.
파이프문자( | )로 구분하여 Processing Command를 연결할 수 있습니다.
FROM kibana_sample_data_flights
| SORT AvgTicketPrice DESC
| LIMIT 3
EVAL 명령어를 사용해 계산된 값을 테이블의 열로 추가할 수 있습니다.
EVAL 명령어는 Function을 지원합니다.
Function에 대한 자세한 설명은 이 링크에서 확인할 수 있습니다.
항공권 평균 가격을 원화로 확인하기 위해 AvgTicketPriceKr 열을 생성
FROM kibana_sample_data_flights
| EVAL AvgTicketPriceKr = AvgTicketPrice * 1300
비행 소요 시간을 소수점 아래 한 자리까지 시간 단위로 표현하기 위해 ROUND 함수를 사용
FROM kibana_sample_data_flights
| EVAL FlightTimeHourApprox = ROUND(FlightTimeMin / 60, 1)
ES|QL을 사용해 집계를 수행할 수 있습니다.
STATS ... BY 명령어를 통해 통계를 계산합니다.
STATS 명령어 한 줄에서 여러 번 집계할 수 있습니다.
BY를 사용해 선택한 열을 기준으로
집계를 Grouping 할 수 있습니다.
비행 거리 중간값 집계
FROM kibana_sample_data_flights
| STATS median_distance_kilometers = MEDIAN(DistanceKilometers)
비행 거리 중간값, 최대값 집계
FROM kibana_sample_data_flights
| STATS median_distance_kilometers = MEDIAN(DistanceKilometers)
, max_distance_kilometers = MAX(DistanceKilometers)
항공사별 비행 거리 중간값 집계
FROM kibana_sample_data_flights
| STATS median_distance_kilometers = MEDIAN(DistanceKilometers) BY Carrier