Strängoperatorer

Kusto-frågespråk (KQL) erbjuder olika frågeoperatorer för sökning av 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 operatorerna string 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 villkoren.

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 till exempel termerna Kusto, KustoExplorerQueryRunoch följande delsträngar: ad67d136, , c1db4f9f, 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, !hasoch 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 söka upp termen i termindexet.

Anteckning

I EngineV2 består en term av fyra eller flera tecken.

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 suffix _cs är skiftlägeskänsliga.

Operator Beskrivning Case-Sensitive Exempel (ger true)
== Lika med Ja "aBc" == "aBc"
!= Inte lika med Ja "abc" != "ABC"
=~ Lika med Inga "abc" =~ "ABC"
!~ Inte lika med Inga "aBc" !~ "xyz"
contains RHS inträffar som en delmängd av LHS Inga "FabriKam" contains "BRik"
!contains RHS förekommer inte i LHS Inga "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 Inga "Fabrikam" endswith "Kam"
!endswith RHS är inte en avslutande delmängd av LHS Inga "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) Inga "North America" has "america"
!has RHS är inte en fullständig term i LHS Inga "North America" !has "amer"
has_all Samma som has men fungerar på alla element Inga "North and South America" has_all("south", "north")
has_any Samma som has men fungerar på något av elementen Inga "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 Inga "North America" hasprefix "ame"
!hasprefix RHS är inte ett termprefix i LHS Inga "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 Inga "North America" hassuffix "ica"
!hassuffix RHS är inte ett termsuffix i LHS Inga "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 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~ Lika med något av elementen Inga "Abc" in~ ("123", "345", "abc")
!in~ Inte lika med något av elementen Inga "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 Inga "Fabrikam" startswith "fab"
!startswith RHS är inte en inledande delmängd av LHS Inga "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. Exempel:

  • Använd ==, inte =~
  • Använd in, inte in~
  • Använd hassuffix_cs, inte hassuffix

För snabbare resultat, om du testar förekomsten av en symbol eller ett alfanumeriskt ord som är bundet av icke-alfanumeriska tecken, eller början eller slutet av ett fält, använder has du eller in. has fungerar snabbare än contains, startswitheller endswith.

Om du vill söka efter IPv4-adresser eller deras prefix använder du en av de särskilda operatorerna på IPv4-adresser som är optimerade för detta ändamål.

Mer information finns i Metodtips 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.

Operator 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."]))