KQL
원본 보기KQL
Kibana 쿼리 언어(KQL)는 데이터를 필터링하는 간단한 텍스트 기반 쿼리 언어입니다.
- KQL은 데이터 필터링만 수행하며, 데이터를 집계, 변환 또는 정렬하는 데는 관여하지 않습니다.
- KQL은 기능 구성이 다른 Lucene 쿼리 언어와 혼동해서는 안 됩니다.
KQL을 사용하면 특정 필드의 값이 존재하거나, 주어진 값과 일치하거나, 주어진 범위 내에 있는 문서를 필터링할 수 있습니다.
KQL을 사용하여 자유 텍스트 검색과 필드 기반 검색을 결합할 수 있습니다. 검색어를 입력하여 모든 필드에서 일치하는 항목을 찾거나, 필드 이름을 입력하기 시작하여 구조화된 쿼리를 만드는 데 사용할 수 있는 필드 이름과 연산자 제안을 확인할 수 있습니다. 반정형 검색은 일치하는 문서를 필터링하고 일치하는 문서만 반환합니다.
| 정확한 구문 쿼리 | http.response.body.content.text:"quick brown fox" |
| 용어 쿼리 | http.response.status_code:400 401 404 |
| 불리언 쿼리 | response:200 or extension:php |
| 범위 쿼리 | account_number >= 100 and items_sold <= 200 |
| 와일드카드 쿼리 | machine.os:win* |
주어진 필드에 인덱싱된 값이 존재하는 문서를 필터링하려면 * 연산자를 사용합니다. 예를 들어 http.request.method 필드가 존재하는 문서를 필터링하려면 다음 구문을 사용합니다.
http.request.method: *
이 구문은 빈 문자열을 포함하여 인덱싱된 모든 값을 확인합니다.
KQL을 사용하여 특정 숫자, 텍스트, 날짜 또는 불리언 값과 일치하는 문서를 필터링할 수 있습니다. 예를 들어 http.request.method가 GET인 문서를 필터링하려면 다음 쿼리를 사용합니다.
http.request.method: GET
필드 매개변수는 선택 사항입니다. 지정하지 않으면 주어진 값을 모든 필드에서 검색합니다. 예를 들어 모든 필드에서 “Hello”를 검색하려면 다음을 사용합니다.
Hello
키워드, 숫자, 날짜 또는 불리언 필드를 쿼리할 때는 문장 부호와 대소문자를 포함하여 값이 정확히 일치해야 합니다. 하지만 텍스트 필드를 쿼리할 때 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.referrer가 https://example.com인 문서를 검색하려면 다음 쿼리 중 하나를 사용합니다.
http.request.referrer: "https://example.com"
http.request.referrer: https\://example.com
다음 문자는 이스케이프해야 합니다.
\():<>"*
주어진 범위 내의 용어를 포함하는 문서를 검색하려면 KQL의 범위 구문을 사용합니다. 예를 들어 http.response.bytes가 10000보다 작은 모든 문서를 검색하려면 다음 구문을 사용합니다.
http.response.bytes < 10000
경계를 포함하는 범위를 검색하려면 여러 범위 조건을 결합합니다. 예를 들어 http.response.bytes가 10000보다 크고 20000보다 작거나 같은 문서를 검색하려면 다음 구문을 사용합니다.
http.response.bytes > 10000 and http.response.bytes <= 20000
다중 값 필드에 여러 조건이 있는 범위 쿼리를 사용하면 각 조건은 배열의 모든 값에 대해 독립적으로 평가됩니다.
예를 들어 number > 300 AND number < 400 쿼리는 500이 첫 번째 조건을 충족하고 10이 두 번째 조건을 충족하므로 "number": [500, 10]이 있는 문서와 일치합니다. 모든 조건을 동일한 값이 충족해야 한다면 대신 Query DSL을 사용하는 것이 좋습니다. Query DSL은 하나 이상의 값이 지정된 범위 내에 완전히 속하는 문서만 일치시킵니다.
문자열 값, IP 주소, 타임스탬프에도 범위 구문을 사용할 수 있습니다. 예를 들어 2주 전보다 이전인 문서를 검색하려면 다음 구문을 사용합니다.
@timestamp < now-2w
사용 가능한 날짜 형식의 더 많은 예시는 Date Math를 참조하세요.
패턴과 일치하는 문서를 검색하려면 와일드카드 구문을 사용합니다. 와일드카드 쿼리는 키워드, 텍스트 및 와일드카드 필드에서는 지원되지만 숫자, 날짜 또는 불리언 필드에서는 지원되지 않습니다. 예를 들어 machine.os가 "win"으로 시작하는 문서를 찾으려면 다음 구문을 사용합니다.
machine.os: win*
성능상의 이유로 기본적으로 선행 와일드카드는 허용되지 않습니다. 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.*가 숫자 필드와 문자열 필드 모두에 일치하면 숫자 필드에서 문자열 값을 쿼리할 수 없으므로 위 쿼리에서 오류가 발생합니다.
중첩 필드를 쿼리하려면 특수 구문이 필요합니다. user가 중첩 필드인 다음 문서를 살펴보겠습니다.
{
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
user 배열 내의 단일 값에 이름 “Alice”와 성 “White”가 포함된 문서를 찾으려면 다음을 사용합니다.
user:{ first: "Alice" and last: "White" }
중첩 필드는 다른 중첩 필드 안에 있을 수 있으므로 쿼리하려는 중첩 필드의 전체 경로를 지정해야 합니다. 예를 들어 user와 names가 모두 중첩 필드인 다음 문서를 살펴보겠습니다.
{
"user": [
{
"names": [
{
"first": "John",
"last": "Smith"
},
{
"first": "Alice",
"last": "White"
}
]
}
]
}
user.names 배열 내의 단일 값에 이름 “Alice”와 성 “White”가 포함된 문서를 찾으려면 다음을 사용합니다.
user.names:{ first: "Alice" and last: "White" }