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 string
terminach są Kusto
to , i następujące podciągy: ad67d136
, KustoExplorerQueryRun
, c1db
4f9f
, , 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
, !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.
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 niein~
- Użyj polecenia
hassuffix_cs
, a niehassuffix
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
, 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 (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."])) |
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla