Operatori di stringa

Linguaggio di query Kusto (KQL) offre vari operatori di query per la ricerca di tipi di dati stringa. L'articolo seguente descrive come vengono indicizzati i termini delle stringhe, elenca gli operatori di query di tipo stringa e fornisce suggerimenti per ottimizzare le prestazioni.

Informazioni sui termini relativi alle stringhe

Kusto indicizza tutte le colonne, incluse quelle di tipo string. Per tali colonne vengono creati più indici, in base ai dati effettivi. Questi indici non vengono esposti direttamente, ma vengono usati nelle query con gli operatori string i cui nomi includono has, ad esempio has, !has, hasprefix, !hasprefix. La semantica di questi operatori è dettata dal modo in cui viene codificata la colonna. Questi operatori non trovano una corrispondenza con sottostringhe "normali", ma piuttosto con termini.

Che cos'è un termine?

Per impostazione predefinita, ogni string valore viene suddiviso in sequenze massime di caratteri alfanumerici e ognuna di queste sequenze viene creata in un termine.

Ad esempio, nell'oggetto string seguente i termini sono Kusto, KustoExplorerQueryRun e le sottostringhe sono ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.

Kusto: ad67d136-c1db-4f9f-88ef-d94f3b6b0b5a;KustoExplorerQueryRun

Kusto compila un indice di termini costituito da tutti i termini che sono tre caratteri o più e questo indice viene usato dagli operatori stringa, ad hasesempio , !hase così via. Se la query cerca un termine di dimensioni inferiori a tre caratteri o usa un contains operatore, la query ripristina l'analisi dei valori nella colonna. L'analisi è molto più lenta rispetto alla ricerca del termine nell'indice del termine.

Nota

In EngineV2 un termine è costituito da quattro o più caratteri.

Operatori su stringhe

In questo articolo vengono usate le abbreviazioni seguenti:

  • RHS (righ hand side) = lato destro dell'espressione
  • LHS (left hand side) = lato sinistro dell'espressione

Gli operatori con suffisso _cs non fanno distinzione tra maiuscole e minuscole.

Operatore Descrizione Distinzione maiuscole/minuscole Esempio (restituisce true)
== Uguale a "aBc" == "aBc"
!= Diverso da "abc" != "ABC"
=~ Uguale a No "abc" =~ "ABC"
!~ Diverso da No "aBc" !~ "xyz"
contains RHS si verifica come sottosequenza di LHS No "FabriKam" contains "BRik"
!contains RHS non si verifica in LHS No "Fabrikam" !contains "xyz"
contains_cs RHS si verifica come sottosequenza di LHS "FabriKam" contains_cs "Kam"
!contains_cs RHS non si verifica in LHS "Fabrikam" !contains_cs "Kam"
endswith RHS è una sottosequenza di chiusura di LHS No "Fabrikam" endswith "Kam"
!endswith RHS non è una sottosequenza di chiusura di LHS No "Fabrikam" !endswith "brik"
endswith_cs RHS è una sottosequenza di chiusura di LHS "Fabrikam" endswith_cs "kam"
!endswith_cs RHS non è una sottosequenza di chiusura di LHS "Fabrikam" !endswith_cs "brik"
has RHS (Right-Hand-Side) è un termine intero in LHS (Left-Hand-Side) No "North America" has "america"
!has RHS non è un termine completo in LHS No "North America" !has "amer"
has_all Uguale a has ma funziona su tutti gli elementi No "North and South America" has_all("south", "north")
has_any Uguale a has ma funziona con qualsiasi elemento No "North America" has_any("south", "north")
has_cs RHS è un termine intero in LHS "North America" has_cs "America"
!has_cs RHS non è un termine completo in LHS "North America" !has_cs "amer"
hasprefix RHS è un prefisso di termine in LHS No "North America" hasprefix "ame"
!hasprefix RHS non è un prefisso di termine in LHS No "North America" !hasprefix "mer"
hasprefix_cs RHS è un prefisso di termine in LHS "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS non è un prefisso di termine in LHS "North America" !hasprefix_cs "CA"
hassuffix RHS è un suffisso di termine in LHS No "North America" hassuffix "ica"
!hassuffix RHS non è un suffisso di termine in LHS No "North America" !hassuffix "americ"
hassuffix_cs RHS è un suffisso di termine in LHS "North America" hassuffix_cs "ica"
!hassuffix_cs RHS non è un suffisso di termine in LHS "North America" !hassuffix_cs "icA"
in Uguale a uno qualsiasi degli elementi "abc" in ("123", "345", "abc")
!in Non è uguale a nessuno degli elementi "bca" !in ("123", "345", "abc")
in~ Uguale a uno qualsiasi degli elementi No "Abc" in~ ("123", "345", "abc")
!in~ Non è uguale a nessuno degli elementi No "bCa" !in~ ("123", "345", "ABC")
matches regex LHS contiene una corrispondenza per RHS "Fabrikam" matches regex "b.*k"
startswith RHS è una sottosequenza iniziale di LHS No "Fabrikam" startswith "fab"
!startswith RHS non è una sottosequenza iniziale di LHS No "Fabrikam" !startswith "kam"
startswith_cs RHS è una sottosequenza iniziale di LHS "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS non è una sottosequenza iniziale di LHS "Fabrikam" !startswith_cs "fab"

Suggerimenti per incrementare le prestazioni

Per migliorare le prestazioni, nel caso di due operatori che svolgono la stessa attività, usare quello che fa distinzione tra maiuscole e minuscole. Ad esempio:

  • Usare ==, non =~
  • Usare in, non in~
  • Usare hassuffix_cs, non hassuffix

Per velocizzare i risultati, se si intende verificare la presenza di un simbolo o di una parola alfanumerica delimitata da caratteri non alfanumerici oppure da inizio o fine di un campo, usare has o in. has è più veloce di contains, startswith o endswith.

Per cercare indirizzi IPv4 o i relativi prefissi, usare uno degli operatori speciali in indirizzi IPv4, ottimizzati per questo scopo.

Per altre informazioni, vedere Procedure consigliate per le query.

Ad esempio, la prima di queste query verrà eseguita più velocemente:

StormEvents | where State has "North" | count;
StormEvents | where State contains "nor" | count

Operatori in indirizzi IPv4

Il gruppo di operatori seguente fornisce una ricerca accelerata degli indici su indirizzi IPv4 o sui relativi prefissi.

Operatore Descrizione Esempio (restituisce true)
has_ipv4 LHS contiene indirizzi IPv4 rappresentati da RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS contiene un indirizzo IPv4 che corrisponde a un prefisso rappresentato da RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS contiene uno degli indirizzi IPv4 forniti da 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 contiene un indirizzo IPv4 che corrisponde a uno dei prefissi forniti da RHS has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))