문자열 연산자

KQL(Kusto 쿼리 언어)은 문자열 데이터 형식을 검색하기 위한 다양한 쿼리 연산자를 제공합니다. 이 문서에서는 문자열 용어가 인덱싱되는 방법을 설명하고, 문자열 쿼리 연산자를 나열하며, 성능을 최적화하기 위한 팁을 제공합니다.

문자열 용어 이해

Kusto는 string 형식의 열을 포함하여 모든 열을 인덱싱합니다. 실제 데이터에 따라 이러한 열에 대해 여러 인덱스가 작성됩니다. 이러한 인덱스는 직접 공개되지 않지만, has, !has, hasprefix, !hasprefix와 같이 이름의 일부로 has가 포함된 string 연산자를 통해 쿼리에 사용됩니다. 이러한 연산자의 의미 체계는 열을 인코딩하는 방식에 따라 결정됩니다. 이러한 연산자는 "일반" 부분 문자열 일치를 수행하는 대신 용어와 일치합니다.

용어란?

기본적으로 각 string 값은 영숫자 문자의 최대 시퀀스로 나뉘며 각 시퀀스는 용어로 만들어집니다.

예를 들어 다음 string에서 용어는 Kusto, KustoExplorerQueryRun이고 부분 문자열은 ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a입니다.

Kusto: ad67d136-c1db-4f9f-88ef-d94f3b6b0b5a;KustoExplorerQueryRun

Kusto는 3자 이상의 모든 용어로 구성된 용어 인덱스를 작성하고, 이 인덱스는 has, !has 등과 같은 문자열 연산자에서 사용됩니다. 3자 미만의 용어를 찾거나 contains 연산자를 사용하는 쿼리는 열 값 검사로 돌아갑니다. 검사는 용어 인덱스에서 용어를 조회하는 것보다 훨씬 느립니다.

참고

EngineV2에서 용어는 4자 이상으로 구성됩니다.

문자열에 대한 연산자

이 문서에서는 다음과 같은 약어를 사용합니다.

  • RHS = 식의 오른쪽
  • LHS = 식의 왼쪽

_cs 접미사가 있는 연산자는 대/소문자를 구분합니다.

연산자 설명 대/소문자 구분 예제(true 생성)
== 같음 "aBc" == "aBc"
!= 같지 않음 "abc" != "ABC"
=~ 같음 아니요 "abc" =~ "ABC"
!~ 같지 않음 아니요 "aBc" !~ "xyz"
contains RHS가 LHS의 하위 시퀀스로 발생함 아니요 "FabriKam" contains "BRik"
!contains RHS가 LHS에서 발생하지 않음 아니요 "Fabrikam" !contains "xyz"
contains_cs RHS가 LHS의 하위 시퀀스로 발생함 "FabriKam" contains_cs "Kam"
!contains_cs RHS가 LHS에서 발생하지 않음 "Fabrikam" !contains_cs "Kam"
endswith RHS가 LHS의 닫는 하위 시퀀스임 아니요 "Fabrikam" endswith "Kam"
!endswith RHS가 LHS의 닫는 하위 시퀀스가 아님 아니요 "Fabrikam" !endswith "brik"
endswith_cs RHS가 LHS의 닫는 하위 시퀀스임 "Fabrikam" endswith_cs "kam"
!endswith_cs RHS가 LHS의 닫는 하위 시퀀스가 아님 "Fabrikam" !endswith_cs "brik"
has 오른쪽(RHS)이 왼쪽(LHS)의 전체 항임 아니요 "North America" has "america"
!has RHS가 LHS에서 전체 용어가 아님 아니요 "North America" !has "amer"
has_all has와 동일하지만 모든 요소에서 작동함 아니요 "North and South America" has_all("south", "north")
has_any has와 동일하지만 모든 요소에서 작동함 아니요 "North America" has_any("south", "north")
has_cs RHS가 LHS에서 전체 용어임 "North America" has_cs "America"
!has_cs RHS가 LHS에서 전체 용어가 아님 "North America" !has_cs "amer"
hasprefix RHS가 LHS에서 용어 접두사임 아니요 "North America" hasprefix "ame"
!hasprefix RHS가 LHS에서 용어 접두사가 아님 아니요 "North America" !hasprefix "mer"
hasprefix_cs RHS가 LHS에서 용어 접두사임 "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS가 LHS에서 용어 접두사가 아님 "North America" !hasprefix_cs "CA"
hassuffix RHS가 LHS에서 용어 접미사임 아니요 "North America" hassuffix "ica"
!hassuffix RHS가 LHS에서 용어 접미사가 아님 아니요 "North America" !hassuffix "americ"
hassuffix_cs RHS가 LHS에서 용어 접미사임 "North America" hassuffix_cs "ica"
!hassuffix_cs RHS가 LHS에서 용어 접미사가 아님 "North America" !hassuffix_cs "icA"
in 모든 요소와 같음 "abc" in ("123", "345", "abc")
!in 어떤 요소와도 같지 않음 "bca" !in ("123", "345", "abc")
in~ 모든 요소와 같음 아니요 "Abc" in~ ("123", "345", "abc")
!in~ 어떤 요소와도 같지 않음 아니요 "bCa" !in~ ("123", "345", "ABC")
matches regex LHS가 RHS에 대한 일치 항목을 포함함 "Fabrikam" matches regex "b.*k"
startswith RHS가 LHS의 초기 하위 시퀀스임 아니요 "Fabrikam" startswith "fab"
!startswith RHS가 LHS의 초기 하위 시퀀스가 아님 아니요 "Fabrikam" !startswith "kam"
startswith_cs RHS가 LHS의 초기 하위 시퀀스임 "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS가 LHS의 초기 하위 시퀀스가 아님 "Fabrikam" !startswith_cs "fab"

성능 팁

성능을 향상시키려면 동일한 작업을 수행하는 두 개의 연산자가 있는 경우 대/소문자를 구분하는 연산자를 사용합니다. 다음은 그 예입니다.

  • 를 사용하지 ==않음 =~
  • 를 사용하지 in않음 in~
  • 를 사용하지 hassuffix_cs않음 hassuffix

더 빠른 결과를 얻으려면 영숫자가 아닌 문자로 바인딩된 기호 또는 영숫자 단어가 있는지 또는 필드의 시작 또는 끝이 있는지 테스트하는 경우 has 또는 in을 사용합니다. hascontains, startswith 또는 endswith보다 빠르게 작동합니다.

IPv4 주소 또는 해당 접두사를 검색하려면 이 용도로 최적화된 IPv4 주소에서 특수 연산자 중 하나를 사용합니다.

자세한 내용은 쿼리 모범 사례를 참조하세요.

예를 들어 다음 쿼리 중 첫 번째 쿼리는 더 빠르게 실행됩니다.

StormEvents | where State has "North" | count;
StormEvents | where State contains "nor" | count

IPv4 주소의 연산자

다음 연산자 그룹은 IPv4 주소 또는 해당 접두사에서 인덱스 가속 검색을 제공합니다.

연산자 Description 예제(true 생성)
has_ipv4 LHS에는 RHS가 나타내는 IPv4 주소가 포함되어 있습니다. has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS에는 RHS가 나타내는 접두사와 일치하는 IPv4 주소가 포함되어 있습니다. has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS에는 RHS에서 제공하는 IPv4 주소 중 하나가 포함되어 있습니다. has_any_ipv4("Source address is 10.1.2.3:1234", dynamic(["10.1.2.3", "127.0.0.1"]))
has_any_ipv4_prefix LHS에는 RHS에서 제공하는 접두사 중 하나와 일치하는 IPv4 주소가 포함되어 있습니다. has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))