Data/ElasticSearch

[ElasticSearch]Kibana키바나 -KQL 쿼리 사용방법 ,루씬(Lucene)과 차이점

뚱요 2022. 10. 29. 23:53
반응형

키바나는 엘라스틱 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

반응형