Kibana Query Language

참고

이 섹션은 자세한 참조 정보를 제공합니다.

SQL 쿼리 언어의 개요와 개념 정보는 Explore and analyze 섹션의 KQL 개요를 참조하세요.

Kibana Query Language(KQL)는 데이터를 필터링하기 위한 간단한 텍스트 기반 쿼리 언어입니다.

  • KQL은 데이터를 필터링하기만 하며, 데이터를 집계하거나 변환하거나 정렬하는 역할은 하지 않습니다.
  • KQL은 기능 구성이 다른 Lucene 쿼리 언어와 혼동해서는 안 됩니다.

KQL을 사용하면 특정 필드에 값이 존재하는 문서, 주어진 값과 일치하는 문서, 또는 주어진 범위 안에 있는 문서를 필터링할 수 있습니다.

특정 필드에 색인된 값이 존재하는 문서를 필터링하려면 * 연산자를 사용합니다. 예를 들어 http.request.method 필드가 존재하는 문서를 필터링하려면 다음 구문을 사용합니다.

http.request.method: *
		

이 쿼리는 빈 문자열을 포함해 색인된 모든 값을 확인합니다.

KQL을 사용해 특정 숫자, 텍스트, 날짜 또는 불리언 값과 일치하는 문서를 필터링할 수 있습니다. 예를 들어 http.request.method가 GET인 문서를 필터링하려면 다음 쿼리를 사용합니다.

http.request.method: GET
		

필드 파라미터는 선택 사항입니다. 지정하지 않으면 주어진 값에 대해 모든 필드를 검색합니다. 예를 들어 모든 필드에서 “Hello”를 검색하려면 다음과 같이 사용합니다.

Hello
		

keyword, 숫자, 날짜 또는 불리언 필드를 쿼리할 때는 구두점과 대소문자를 포함해 값이 정확히 일치해야 합니다. 반면 text 필드를 쿼리할 때는 Elasticsearch가 필드의 매핑 설정에 따라 제공된 값을 분석합니다. 예를 들어 http.request.body.content(text 필드)에 “null pointer”라는 텍스트가 포함된 문서를 검색하려면 다음과 같이 합니다.

http.request.body.content: null pointer
		

이 필드는 text 필드이므로 검색어의 순서는 중요하지 않으며, “pointer null”이 포함된 문서도 반환됩니다. 제공한 순서대로 검색어가 나타나는 text 필드를 검색하려면 다음과 같이 값을 큰따옴표로 감쌉니다.

http.request.body.content: "null pointer"
		

특정 문자는 (따옴표로 감싸지 않는 한) 백슬래시로 이스케이프해야 합니다. 예를 들어 http.request.referrerhttps://<example-url>인 문서를 검색하려면 다음 쿼리 중 하나를 사용합니다.

http.request.referrer: "https://<example-url>"
http.request.referrer: https\://<example-url>
		

다음 문자는 반드시 이스케이프해야 합니다.

\():<>"*
		

제공된 범위 안의 용어를 포함하는 문서를 검색하려면 KQL의 범위 구문을 사용합니다. 예를 들어 http.response.bytes가 10000 미만인 모든 문서를 검색하려면 다음 구문을 사용합니다.

http.response.bytes < 10000
		

경계를 포함하는 범위를 검색하려면 여러 범위 쿼리를 조합합니다. 예를 들어 http.response.bytes가 10000보다 크고 20000 이하인 문서를 검색하려면 다음 구문을 사용합니다.

http.response.bytes > 10000 and http.response.bytes <= 20000
		

범위 구문은 문자열 값, IP 주소, 타임스탬프에도 사용할 수 있습니다. 예를 들어 2주 전보다 이전인 문서를 검색하려면 다음 구문을 사용합니다.

@timestamp < now-2w
		

허용되는 날짜 형식에 대한 더 많은 예시는 Date Math를 참조하세요.

패턴과 일치하는 문서를 검색하려면 와일드카드 구문을 사용합니다. 예를 들어 http.response.status_code가 4로 시작하는 문서를 찾으려면 다음 구문을 사용합니다.

http.response.status_code: 4*
		

기본적으로 성능상의 이유로 선행 와일드카드는 허용되지 않습니다. query:allowLeadingWildcards 고급 설정으로 이를 변경할 수 있습니다.

참고

현재는 *만 지원됩니다. 이는 0개 이상의 문자와 일치합니다.

문서 집합을 부정하거나 제외하려면 not 키워드(대소문자 구분 없음)를 사용합니다. 예를 들어 http.request.method가 GET이 아닌 문서를 필터링하려면 다음 쿼리를 사용합니다.

NOT http.request.method: GET
		

여러 쿼리를 조합하려면 and/or 키워드(대소문자 구분 없음)를 사용합니다. 예를 들어 http.request.method가 GET 이거나 http.response.status_code가 400인 문서를 찾으려면 다음 쿼리를 사용합니다.

http.request.method: GET OR http.response.status_code: 400
		

마찬가지로 http.request.method가 GET 이고 http.response.status_code가 400인 문서를 찾으려면 다음 쿼리를 사용합니다.

http.request.method: GET AND http.response.status_code: 400
		

여러 쿼리를 조합할 때 우선순위를 지정하려면 괄호를 사용합니다. 예를 들어 http.request.method가 GET 이고 http.response.status_code가 200이거나, 또는 http.request.method가 POST 이고 http.response.status_code가 400인 문서를 찾으려면 다음과 같이 합니다.

(http.request.method: GET AND http.response.status_code: 200) OR
(http.request.method: POST AND http.response.status_code: 400)
		

같은 필드에 대해 여러 값을 쿼리할 때 축약 구문으로 괄호를 사용할 수도 있습니다. 예를 들어 http.request.method가 GET, POST 또는 DELETE인 문서를 찾으려면 다음과 같이 합니다.

http.request.method: (GET OR POST OR DELETE)
		

와일드카드는 여러 필드를 쿼리하는 데도 사용할 수 있습니다. 예를 들어 datastream의 하위 필드 중 하나라도 “logs”를 포함하는 문서를 검색하려면 다음과 같이 합니다.

datastream.*: logs
		
참고

와일드카드로 여러 필드를 쿼리할 때 필드 타입이 서로 다르면 오류가 발생할 수 있습니다. 예를 들어 datastream.*가 숫자 필드와 문자열 필드 모두와 일치하면, 숫자 필드는 문자열 값으로 쿼리할 수 없기 때문에 위 쿼리는 오류를 발생시킵니다.

nested 필드를 쿼리하려면 특별한 구문이 필요합니다. user가 nested 필드인 다음 문서를 살펴보세요.

{
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}
		

user 배열 안의 단일 값이 이름 “Alice”와 성 “White”를 포함하는 문서를 찾으려면 다음과 같이 합니다.

user:{ first: "Alice" and last: "White" }
		

nested 필드는 다른 nested 필드 안에 있을 수 있으므로, 쿼리하려는 nested 필드의 전체 경로를 지정해야 합니다. 예를 들어 usernames가 모두 nested 필드인 다음 문서를 살펴보세요.

{
  "user": [
    {
      "names": [
        {
          "first": "John",
          "last": "Smith"
        },
        {
          "first": "Alice",
          "last": "White"
        }
      ]
    }
  ]
}
		

user.names 배열 안의 단일 값이 이름 “Alice” 이고 성 “White”를 포함하는 문서를 찾으려면 다음과 같이 합니다.

user.names:{ first: "Alice" and last: "White" }