키바나는 엘라스틱 ELK 스택에서 시각화하는 스택이다. 대시보드 기능 , 데이터 탐색 기능 등을 제공합니다. 키바나에서 값 조회 시 Kibana Query Language (KQL)과 Lucene query syntax를 통해서 조회가 가능합니다. 엘라스틱서치의 json 형태보다 간단하게 작성하여 서치가 가능합니다.
이 두 언어의 차이점을 간략히 다루고 KQL 에 대해서 집중적으로 다뤄봅니다. 다음 편에는 Lucene query syntax를 다룰 예정입니다.
1. KQL과 Lucene 의 차이점
언어 설정은 쿼리를 작성하는 곳 우측에 KQL 을 누러서 메시지가 On되면 KQL, Off면 루씬이 적용된다.
KQL 은 키바나에서 검색창에 사용하는 쿼리 언어로 검색하는 사람의 사용자 편의 중심으로 만들어졌습니다. 쿼리를 사용하지 않고도 filtering + 버튼을 이용해서도 가능합니다. Elasticsearch에서 필터링하기 위한 쿼리로 정렬 및 집계 불가합니다.
Apache Lucene은 Java언어로 이루어진 오픈 소스 형태의 정보 검색 라이브러리로 웹사이트나 어플리케이션에서 쉽게 사용할 수 있도록 도와줍니다. Lucene query syntax를 통해서 인덱스를 조회합니다.
각 특징을 잘 활용해서 Lucene 과 KQL을 선택해서 사용하는 것을 추천합니다. 이러한 점은 엘라스틱서치 공식문서에도 advanced 기능을 이용할 때 사용하라고 언급되어 있습니다.
KQL | Lucene 루씬 | |
특징 | 중첩 객체, 스크립트된 필드 사용 가능 | 정규표현식, fuzzy search , 부스팅 |
범위 쿼리 | 비교 연산자 <, >, >= , <= 예. 100 <= x and x <=200 예. 200>= x |
[ ], { } [100 to 200] [200 to *] |
Exists 쿼리 |
* | _exists_ * 가능하지만 빈값 |
Wildcards | * 해당 글자를 포함한 0개 이상의 단어 매칭 앞, 중간, 뒤 위치 가능 |
? 해당 글자를 포함하여 1개 글자 매칭 |
연산자 | (), not, and, or | +(필수), -(제외) , (선택) +Kim -yoyo |
fuzzy search
fuzzy matching 알고리즘을 이용해서 대략적으로 검색어와 일치하는 유관한 다양한 검색결과를 리턴하는 것을 의미
Ealstic Search 에서의 NULL, Empty String
NULL ES에서인덱싱 처리 시 속성 값을 넣지 않은 경우
Empty String ES에서 속성값에 '' 넣은 경우
필드명, 값, 연사자 등을 자동 완성하여 추천하는 기능은 키바나 세팅에서 설정할 수 있습니다.
2. Kibana Query Language (KQL)
기본 형태
필드 : 검색어
1. Temrs Query
- 검색어를 찾는데 사용하는 쿼리
- 공백으로 각 검색어를 구분(순서 상관 업음)
- 쌍따옴표("구문")를 사용하면 정확한 구문 일치하는 document 리턴
1) 특정 필드에서 검색어를 찾는 경우
e.g. 제품이 옷 포함한 모든 경우
product : clothing
특정 필드를 언급하지 않으면 기본값으로 저장된 필드로 검색
"A123"
2. Boolean Query
- or, and, not 연산자
- 우선순위가 존재
우선순위: () > and > or
- `( )` 로 오버 라이딩해서 기본적 우선순위를 바꿀 수 있다. 수학에서 계산 순서를 바꾸는 것과 동일한 로직입니다.
2.1 or
e.g. 거래 아이디 12345이거나 옷 제품인 경우
transID: 12345 or product : clothing
2.2 and
e.g. 거래 아이디 12345 가 구매한 거래 중에서 제품이 옷인 경우
transID: 12345 and product : clothing
e.g. 빨간 옷이거나 신발인 경우
color: red and product : clothing or product : shoes
color: red and product : clothing shoes
2.3 ()
e.g. 제품 중 신발이거나 옷 중에서 빨간색인 경우
color: red and ( producct : clothing or product : shoes )
e.g. 붉은색 제외한 모든 색
not color: red
e.g. 붉은색을 갖고 있으나 제품이 옷이거나 신발이 아닌 경우
color: red and not( product : clothing or producct : shoes )
2.4 list
e.g. 색상이 붉은색, 녹색, 청색인 경우
colors:(red and green and blue )
3. Range Queries
- 수치형 데이터의 범위를 제한하는 쿼리로 비교 연산자 (>, >=, < , < =) 사용할 수 있습니다.
e.g. 가격 1만 이상 5만 미만
price >= 10000 and price < 500000
4. Date Range Queries
- 시간 (타임스탬프)도 필터링할 수 있습니다.
- 기본 형태 “yyyy-M-ddTHH:MM:SS”
구분 | 년 | 월 | 주 | 일 | 시간 | 시 | 분 | 초 | 현재 타임스템프 |
표현 | y | M | w | d | h | H | m | s | now |
- 시간 필드를 기준으로 계산하여 필터링 할 수 있습니다.(예. 오늘로부터 10일 전)
구분 | 전 | 후 | 버림(작은 단위 00부터 시작) | 구분자 |
표현 | - | + | / | 고정일||범위 |
e.g. 2022년10월 25일 21시 55분 59초 전
@timestamp < "2022-10-25T21:55:59"
e.g. 2022년 10월 전
@timestamp < "2022-10"
4.1 Date math
e.g. 현재 날짜 시간 기준 하루 전 00시 00분 00초 이후에 생성된 경우 -> 2022년 10월 28일 00:00:00
created_at > now-1h/d
e.g. 2022년 10월 29일(milliseconds)로 부터 한 달 뒤 업데이트하는 경우 -> 2022년 11월 29일 00:00:00
updated_at < 2022.10.29||+1M/d
5. Exist queries
필드가 값을 갖고 있는 경우
e.g. 응답 코드를 갖는 모든 경우
response_code: *
6. Wildcard queries
엑셀에서도 사용되는 와일드카드
특정 글자, 단어를 찾을 때 패턴기반으로 여러 항목을 찾을때 사용
6.1 하나의 필드내에서 특정 단어로 시작, 끝나는 단어 조회
e.g. 김 씨 성을 갖는 모든 사용자 명
User.name : Kim*
6.2여러개 필드 조회
- TEXT, KEYWORD 필드 모두에서 조회해야 하는 경우
user.name, user.name.keyword 에서 김 밥 조회
User.name* : "Kim Bob"
7. Nested field queries
중첩된 문서에 중첩된 쿼리와 매치시키기 위해 사용
쿼리 기본 형태
nested path { nested group}
7.1 하나의 document에 nested group을 매치하는 경우
- 일치하지 않으면 리턴 없음
{
"grocery_name": "Elastic Eats",
"items": [
{
"name": "banana",
"stock": "12",
"category": "fruit"
},
{
"name": "peach",
"stock": "10",
"category": "fruit"
},
{
"name": "carrot",
"stock": "9",
"category": "vegetable"
},
{
"name": "broccoli",
"stock": "5",
"category": "vegetable"
}
]
}
e.g. 11개 이상의 바나나가 있는 경우
items : { banana and stock >10}
결과값
name | stock | category |
banana | 12 | fruit |
7.2 각각의 다큐먼트에 매치하는 경우
e.g. 바나나랑 5개 재고가 남은 다큐먼트
items:{ name:banana } and items:{ stock:5 }
결과값
name | stock | category |
banana | 12 | fruit |
broccoli | 5 | vegetable |
e.g. 10개 넘는 재고가 있는 바나나랑 5개 재고가 남은 다큐먼트
items:{ name:banana and stock <3 } and items:{ stock:5 }
결과값
name | stock | category |
broccoli | 5 | vegetable |
8. Nested fields query
- 중첩 필드 내에 또 다른 중첩 필드 지원
- 중첩하기 위해서 전체 path를 구체화해야 함
- path 형태 : `상위레벨.하위레벨`
{
"level1": [
{
"level2": [
{
"prop1": "foo",
"prop2": "bar"
},
{
"prop1": "baz",
"prop2": "qux"
}
]
}
]
}
level1.level2:{ prop1:foo and prop2:bar }
출처
https://www.elastic.co/guide/en/kibana/current/kuery-query.html
https://www.elastic.co/guide/en/elasticsearch/reference/8.4/common-options.html#date-math
https://www.elastic.co/guide/en/elasticsearch/reference/8.4/api-conventions.html#time-units
'Data > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] Kibana Timelion타임라이언 시계열 시각화 사용법 - 기본 (0) | 2023.01.16 |
---|