Operatory ciągów

język zapytań Kusto (KQL) oferuje różne operatory zapytań do wyszukiwania typów danych ciągów. W poniższym artykule opisano sposób indeksowania terminów ciągów, listę operatorów zapytań ciągów i wskazówki dotyczące optymalizacji wydajności.

Opis terminów ciągu

Kusto indeksuje wszystkie kolumny, w tym kolumny typu string. Wiele indeksów jest tworzonych dla takich kolumn, w zależności od rzeczywistych danych. Te indeksy nie są bezpośrednio widoczne, ale są używane w zapytaniach z operatorami string , które mają has jako część ich nazwy, takie jak has, , !has, hasprefix, !hasprefix. Semantyka tych operatorów jest dyktowana przez sposób kodowania kolumny. Zamiast wykonywać dopasowanie "zwykłego" podciągu, te operatory pasują do terminów.

Co to jest termin?

Domyślnie każda string wartość jest podzielona na maksymalną sekwencję znaków alfanumerycznych, a każda z tych sekwencji jest wprowadzana w termin.

Na przykład w następujących stringterminach są Kustoto , i następujące podciągy: ad67d136, KustoExplorerQueryRun, c1db4f9f, , 88ef, d94f3b6b0b5a.

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

Kusto tworzy indeks terminów składający się z wszystkich terminów, które są trzema znakami lub więcej, a ten indeks jest używany przez operatory ciągów, takie jak has, !hasi tak dalej. Jeśli zapytanie szuka terminu, który jest mniejszy niż trzy znaki lub używa contains operatora, zapytanie powróci do skanowania wartości w kolumnie. Skanowanie jest znacznie wolniejsze niż wyszukiwanie terminu w indeksie terminów.

Uwaga

W wersji EngineV2 termin składa się z co najmniej czterech znaków.

Operatory na ciągach

W tym artykule są używane następujące skróty:

  • RHS = prawa strona wyrażenia
  • LHS = lewa strona wyrażenia

Operatory z sufiksem _cs są uwzględniane wielkości liter.

Operator Opis Case-Sensitive Przykład (wydajność true)
== Równa się Tak "aBc" == "aBc"
!= Nie równa się Tak "abc" != "ABC"
=~ Równa się Nie "abc" =~ "ABC"
!~ Nie równa się Nie "aBc" !~ "xyz"
contains RhS występuje jako podsekwencja LHS Nie "FabriKam" contains "BRik"
!contains RhS nie występuje w LHS Nie "Fabrikam" !contains "xyz"
contains_cs RhS występuje jako podsekwencja LHS Tak "FabriKam" contains_cs "Kam"
!contains_cs RhS nie występuje w LHS Tak "Fabrikam" !contains_cs "Kam"
endswith RHS to zamykająca podsekwencja LHS Nie "Fabrikam" endswith "Kam"
!endswith RHS nie jest zamykającym podsekwencją LHS Nie "Fabrikam" !endswith "brik"
endswith_cs RHS to zamykająca podsekwencja LHS Tak "Fabrikam" endswith_cs "kam"
!endswith_cs RHS nie jest zamykającym podsekwencją LHS Tak "Fabrikam" !endswith_cs "brik"
has Po prawej stronie (RHS) jest cały termin w lewej stronie (LHS) Nie "North America" has "america"
!has RHS nie jest pełnym terminem w LHS Nie "North America" !has "amer"
has_all To samo, co has ale działa na wszystkich elementach Nie "North and South America" has_all("south", "north")
has_any To samo, co has ale działa na dowolnym z elementów Nie "North America" has_any("south", "north")
has_cs RHS jest cały termin w LHS Tak "North America" has_cs "America"
!has_cs RHS nie jest pełnym terminem w LHS Tak "North America" !has_cs "amer"
hasprefix RHS to prefiks terminu w LHS Nie "North America" hasprefix "ame"
!hasprefix RHS nie jest prefiksem terminu w LHS Nie "North America" !hasprefix "mer"
hasprefix_cs RHS to prefiks terminu w LHS Tak "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS nie jest prefiksem terminu w LHS Tak "North America" !hasprefix_cs "CA"
hassuffix RHS jest sufiksem terminu w LHS Nie "North America" hassuffix "ica"
!hassuffix RHS nie jest sufiksem terminu w LHS Nie "North America" !hassuffix "americ"
hassuffix_cs RHS jest sufiksem terminu w LHS Tak "North America" hassuffix_cs "ica"
!hassuffix_cs RHS nie jest sufiksem terminu w LHS Tak "North America" !hassuffix_cs "icA"
in Równa się dowolnej z elementów Tak "abc" in ("123", "345", "abc")
!in Nie równa się żadnej z elementów Tak "bca" !in ("123", "345", "abc")
in~ Równa się dowolnej z elementów Nie "Abc" in~ ("123", "345", "abc")
!in~ Nie równa się żadnej z elementów Nie "bCa" !in~ ("123", "345", "ABC")
matches regex LHS zawiera dopasowanie rhS Tak "Fabrikam" matches regex "b.*k"
startswith RHS to początkowa podsekwencja LHS Nie "Fabrikam" startswith "fab"
!startswith RHS nie jest początkową podsekwencją LHS Nie "Fabrikam" !startswith "kam"
startswith_cs RHS to początkowa podsekwencja LHS Tak "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS nie jest początkową podsekwencją LHS Tak "Fabrikam" !startswith_cs "fab"

Porady dotyczące wydajności

Aby uzyskać lepszą wydajność, jeśli istnieją dwa operatory, które wykonują to samo zadanie, należy użyć jednej z rozróżnianych wielkości liter. Na przykład:

  • Użyj polecenia ==, a nie =~
  • Użyj polecenia in, a nie in~
  • Użyj polecenia hassuffix_cs, a nie hassuffix

Aby uzyskać szybsze wyniki, jeśli testujesz obecność symbolu lub wyrazu alfanumerycznego powiązanego znakami innych niż alfanumeryczne, lub początek lub koniec pola, użyj polecenia has lub in. has działa szybciej niż contains, startswithlub endswith.

Aby wyszukać adresy IPv4 lub ich prefiksy, użyj jednego ze specjalnych operatorów na adresach IPv4, które są zoptymalizowane do tego celu.

Aby uzyskać więcej informacji, zobacz Najlepsze rozwiązania dotyczące zapytań.

Na przykład pierwsze z tych zapytań będzie działać szybciej:

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

Operatory na adresach IPv4

Poniższa grupa operatorów udostępnia przyspieszone wyszukiwanie indeksów na adresach IPv4 lub ich prefiksach.

Operator Opis Przykład (yields true)
has_ipv4 Protokół LHS zawiera adres IPv4 reprezentowany przez rhS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix Protokół LHS zawiera adres IPv4 zgodny z prefiksem reprezentowanym przez rhS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 Protokół LHS zawiera jeden z adresów IPv4 dostarczonych przez rhS has_any_ipv4("Source address is 10.1.2.3:1234", dynamic(["10.1.2.3", "127.0.0.1"]))
has_any_ipv4_prefix Protokół LHS zawiera adres IPv4 zgodny z jednym z prefiksów dostarczonych przez rhS has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))