Udostępnij za pośrednictwem


Operatory ciągów

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

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, wyświetlanie listy operatorów zapytań ciągów oraz wskazówki dotyczące optymalizowania wydajności.

Opis terminów ciągu

Usługa 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ą widoczne bezpośrednio, ale są używane w zapytaniach z operatoramistring, które mają has w ramach ich nazwy, takie jak has, , !hashasprefix, , !hasprefix. Semantyka tych operatorów jest dyktowana przez sposób kodowania kolumny. Zamiast odpowiadać "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ą KustoKustoExplorerQueryRun, i następujące podciągy: ad67d136, , c1db, 4f9f, 88efd94f3b6b0b5a.

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

Kusto tworzy indeks terminów składający się ze wszystkich terminów, które są trzy lub więcej znaków, 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.

Operatory w 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 Uwzględniana wielkość liter Przykład (plony 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 podsekwencja zamykająca LHS Nie. "Fabrikam" endswith "Kam"
!endswith RHS nie jest podsekwencją zamykającą LHS Nie. "Fabrikam" !endswith "brik"
endswith_cs RHS to podsekwencja zamykająca LHS Tak "Fabrikam" endswith_cs "kam"
!endswith_cs RHS nie jest podsekwencją zamykającą LHS Tak "Fabrikam" !endswith_cs "brik"
has Prawa strona (RHS) to 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 to 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 to sufiks terminu w LHS Nie. "North America" hassuffix "ica"
!hassuffix RhS nie jest sufiksem terminu w LHS Nie. "North America" !hassuffix "americ"
hassuffix_cs RHS to sufiks 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ę dowolnemu elementowi 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ę dowolnemu elementowi 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 do 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"

Wskazówki dotyczące wydajności

Aby uzyskać lepszą wydajność, jeśli istnieją dwa operatory, które wykonują to samo zadanie, użyj z uwzględnieniem 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 alfanumerycznego słowa, który jest powiązany przez znaki inne niż alfanumeryczne, albo 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 (plony true)
has_ipv4 LHS zawiera adres IPv4 reprezentowany przez RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS zawiera adres IPv4, który pasuje do prefiksu reprezentowanego przez RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 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 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."]))