Dela via


Strängoperatorer

Gäller för: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft 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, KustoExplorerQueryRunoch 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, !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 leta upp termen i termindexet.

Även om Explorer är en delsträng av KustoExplorerQueryRunreturnerar "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, inte in~
  • Använd hassuffix_cs, inte hassuffix

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 inför snabbare resultat. has fungerar snabbare än contains, startswitheller 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."]))