Strängoperatorer
Gäller för: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Kusto Query Language (KQL) erbjuder olika frågeoperatorer för sökning efter strängdatatyper. I följande artikel beskrivs hur strängtermer indexeras, visar en lista över strängfrågeoperatorer och ger tips för att optimera prestanda.
Förstå strängtermer
Kusto indexerar alla kolumner, inklusive kolumner av typen string
. Flera index skapas för sådana kolumner, beroende på faktiska data. Dessa index exponeras inte direkt, men används i frågor med de string
operatorer som har has
som en del av deras namn, till exempel has
, !has
, hasprefix
, !hasprefix
. Semantiken för dessa operatorer styrs av hur kolumnen kodas. I stället för att göra en "vanlig" delsträngsmatchning matchar dessa operatorer termer.
Vad är en term?
Som standard delas varje string
värde upp i maximala sekvenser med alfanumeriska tecken, och var och en av dessa sekvenser görs till en term.
I följande string
är termerna till exempel Kusto
, KustoExplorerQueryRun
och följande delsträngar: ad67d136
, c1db
, 4f9f
, 88ef
, d94f3b6b0b5a
.
Kusto: ad67d136-c1db-4f9f-88ef-d94f3b6b0b5a;KustoExplorerQueryRun
Kusto skapar ett termindex som består av alla termer som är tre tecken eller fler, och det här indexet används av strängoperatorer som has
, !has
och så vidare. Om frågan letar efter en term som är mindre än tre tecken eller använder en contains
-operator, återgår frågan till att skanna värdena i kolumnen. Genomsökningen är mycket långsammare än att leta upp termen i termindexet.
Även om Explorer
är en delsträng av KustoExplorerQueryRun
returnerar "KustoExplorerQueryRun" has "Explorer"
false
medan "KustoExplorerQueryRun" contains "Explorer"
returnerar true
. Detta är subtilt men beteendet beror på att has
är termbaserad.
Operatorer på strängar
Följande förkortningar används i den här artikeln:
- RHS = höger sida av uttrycket
- LHS = vänster sida av uttrycket
Operatorer med ett _cs
suffix är skiftlägeskänsliga.
Operatör | Beskrivning | Case-Sensitive | Exempel (ger true ) |
---|---|---|---|
== |
Motsvarar | Ja | "aBc" == "aBc" |
!= |
Inte lika med | Ja | "abc" != "ABC" |
=~ |
Motsvarar | Nej | "abc" =~ "ABC" |
!~ |
Inte lika med | Nej | "aBc" !~ "xyz" |
contains |
RHS inträffar som en delmängd av LHS | Nej | "FabriKam" contains "BRik" |
!contains |
RHS förekommer inte i LHS | Nej | "Fabrikam" !contains "xyz" |
contains_cs |
RHS inträffar som en delmängd av LHS | Ja | "FabriKam" contains_cs "Kam" |
!contains_cs |
RHS förekommer inte i LHS | Ja | "Fabrikam" !contains_cs "Kam" |
endswith |
RHS är en avslutande delmängd av LHS | Nej | "Fabrikam" endswith "Kam" |
!endswith |
RHS är inte en avslutande delmängd av LHS | Nej | "Fabrikam" !endswith "brik" |
endswith_cs |
RHS är en avslutande delmängd av LHS | Ja | "Fabrikam" endswith_cs "kam" |
!endswith_cs |
RHS är inte en avslutande delmängd av LHS | Ja | "Fabrikam" !endswith_cs "brik" |
has |
Höger sida (RHS) är en hel term i vänster sida (LHS) | Nej | "North America" has "america" |
!has |
RHS är inte en fullständig term i LHS | Nej | "North America" !has "amer" |
has_all |
Samma som has men fungerar på alla element |
Nej | "North and South America" has_all("south", "north") |
has_any |
Samma som has men fungerar på något av elementen |
Nej | "North America" has_any("south", "north") |
has_cs |
RHS är en hel term i LHS | Ja | "North America" has_cs "America" |
!has_cs |
RHS är inte en fullständig term i LHS | Ja | "North America" !has_cs "amer" |
hasprefix |
RHS är ett termprefix i LHS | Nej | "North America" hasprefix "ame" |
!hasprefix |
RHS är inte ett termprefix i LHS | Nej | "North America" !hasprefix "mer" |
hasprefix_cs |
RHS är ett termprefix i LHS | Ja | "North America" hasprefix_cs "Ame" |
!hasprefix_cs |
RHS är inte ett termprefix i LHS | Ja | "North America" !hasprefix_cs "CA" |
hassuffix |
RHS är ett termsuffix i LHS | Nej | "North America" hassuffix "ica" |
!hassuffix |
RHS är inte ett termsuffix i LHS | Nej | "North America" !hassuffix "americ" |
hassuffix_cs |
RHS är ett termsuffix i LHS | Ja | "North America" hassuffix_cs "ica" |
!hassuffix_cs |
RHS är inte ett termsuffix i LHS | Ja | "North America" !hassuffix_cs "icA" |
in |
Är lika med något av elementen | Ja | "abc" in ("123", "345", "abc") |
!in |
Inte lika med något av elementen | Ja | "bca" !in ("123", "345", "abc") |
in~ |
Är lika med något av elementen | Nej | "Abc" in~ ("123", "345", "abc") |
!in~ |
Inte lika med något av elementen | Nej | "bCa" !in~ ("123", "345", "ABC") |
matches regex |
LHS innehåller en matchning för RHS | Ja | "Fabrikam" matches regex "b.*k" |
startswith |
RHS är en inledande delmängd av LHS | Nej | "Fabrikam" startswith "fab" |
!startswith |
RHS är inte en inledande delmängd av LHS | Nej | "Fabrikam" !startswith "kam" |
startswith_cs |
RHS är en inledande delmängd av LHS | Ja | "Fabrikam" startswith_cs "Fab" |
!startswith_cs |
RHS är inte en inledande delmängd av LHS | Ja | "Fabrikam" !startswith_cs "fab" |
Prestandatips
För bättre prestanda, när det finns två operatorer som utför samma uppgift, använder du skiftlägeskänslig en. Till exempel:
- Använd
==
, inte=~
- Använd
in
, intein~
- Använd
hassuffix_cs
, intehassuffix
Om du testar om det finns en symbol eller ett alfanumeriskt ord som är bundet av icke-alfanumeriska tecken eller början eller slutet av ett fält använder du has
eller in
för snabbare resultat.
has
fungerar snabbare än contains
, startswith
eller endswith
.
Om du vill söka efter IPv4-adresser eller deras prefix använder du någon av de särskilda operatorerna på IPv4-adresser, som är optimerade för detta ändamål.
Mer information finns i Bästa praxis för frågor.
Till exempel körs den första av dessa frågor snabbare:
StormEvents | where State has "North" | count;
StormEvents | where State contains "nor" | count
Operatorer på IPv4-adresser
Följande grupp med operatorer tillhandahåller indexaccelererad sökning på IPv4-adresser eller deras prefix.
Operatör | Beskrivning | Exempel (ger true ) |
---|---|---|
has_ipv4 | LHS innehåller IPv4-adress som representeras av RHS | has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3") |
has_ipv4_prefix | LHS innehåller en IPv4-adress som matchar ett prefix som representeras av RHS | has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.") |
has_any_ipv4 | LHS innehåller en av IPv4-adresser som tillhandahålls av 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 innehåller en IPv4-adress som matchar ett av prefixen som tillhandahålls av RHS | has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."])) |