Operatori di stringa
Si applica a: ✅Microsoft Fabric✅Azure Esplora dati✅ Azure Monitor✅Microsoft Sentinel
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 fatta 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 has
esempio , !has
e così via. Se la query cerca un termine minore di 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.
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 ) |
---|---|---|---|
== |
Equals | Sì | "aBc" == "aBc" |
!= |
Non uguale a | Sì | "abc" != "ABC" |
=~ |
Equals | No | "abc" =~ "ABC" |
!~ |
Non uguale a | 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 | Sì | "FabriKam" contains_cs "Kam" |
!contains_cs |
RHS non si verifica in LHS | Sì | "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 | Sì | "Fabrikam" endswith_cs "kam" |
!endswith_cs |
RHS non è una sottosequenza di chiusura di LHS | Sì | "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 | Sì | "North America" has_cs "America" |
!has_cs |
RHS non è un termine completo in LHS | Sì | "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 | Sì | "North America" hasprefix_cs "Ame" |
!hasprefix_cs |
RHS non è un prefisso di termine in LHS | Sì | "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 | Sì | "North America" hassuffix_cs "ica" |
!hassuffix_cs |
RHS non è un suffisso di termine in LHS | Sì | "North America" !hassuffix_cs "icA" |
in |
Uguale a uno qualsiasi degli elementi | Sì | "abc" in ("123", "345", "abc") |
!in |
Non è uguale a nessuno degli elementi | Sì | "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 | Sì | "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 | Sì | "Fabrikam" startswith_cs "Fab" |
!startswith_cs |
RHS non è una sottosequenza iniziale di LHS | Sì | "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
, nonin~
- Usare
hassuffix_cs
, nonhassuffix
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 sugli 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 la ricerca accelerata degli indici sugli indirizzi IPv4 o sui relativi prefissi.
Operatore | Descrizione | Esempio (restituisce true ) |
---|---|---|
has_ipv4 | LHS contiene l'indirizzo IPv4 rappresentato 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."])) |