Operatory ciągów
Dotyczy: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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
, , !has
hasprefix
, , !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 string
terminach są Kusto
KustoExplorerQueryRun
, i następujące podciągy: ad67d136
, , c1db
, 4f9f
, 88ef
d94f3b6b0b5a
.
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
, !has
i 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 niein~
- Użyj polecenia
hassuffix_cs
, a niehassuffix
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
, startswith
lub 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."])) |