Opérateurs de chaîne

Langage de requête Kusto (KQL) propose différents opérateurs de requête pour la recherche de types de données de chaîne. L'article suivant explique comment les termes de type String sont indexés, répertorie les opérateurs de requête String, et donne des conseils pour optimiser les performances.

Présentation des termes de type String

Kusto indexe toutes les colonnes, y compris les colonnes de type string. Des index multiples sont générés pour ces colonnes, en fonction des données réelles. Ces index ne sont pas directement exposés, mais ils sont utilisés dans les requêtes avec les opérateurs string qui comportent has dans leur nom, comme has, !has, hasprefix, !hasprefix. La sémantique de ces opérateurs est dictée par la manière dont la colonne est encodée. Au lieu d'établir une correspondance standard entre substrings, ces opérateurs font correspondre des termes.

Qu'est-ce qu'un terme ?

Par défaut, chaque string valeur est divisée en séquences maximales de caractères alphanumériques, et chacune de ces séquences est transformée en un terme.

Par exemple, dans la string suivante, Kusto, KustoExplorerQueryRun sont des termes, tandis que ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a sont des substrings.

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

Kusto génère un index composé de tous les termes d’au moins trois caractères, et cet index est utilisé par les opérateurs de chaîne has, !has et ainsi de suite. Si la requête recherche un terme de moins de trois caractères ou utilise un opérateur contains, elle recommence à analyser les valeurs de la colonne. L’analyse est beaucoup plus lente que la recherche du terme dans l’index des termes.

Notes

Dans EngineV2, un terme se compose de quatre caractères ou plus.

Opérateurs utilisés sur les chaînes

Les abréviations suivantes sont utilisées dans cet article :

  • CD = côté droit de l'expression
  • CG = côté gauche de l'expression

Les opérateurs dotés du suffixe _cs respectent la casse.

Opérateur Description Respecte la casse Exemple (génère true)
== Égal à Oui "aBc" == "aBc"
!= Non égal à Oui "abc" != "ABC"
=~ Égal à Non "abc" =~ "ABC"
!~ Non égal à Non "aBc" !~ "xyz"
contains RHS apparaît comme une sous-séquence de LHS Non "FabriKam" contains "BRik"
!contains RHS ne figure pas dans LHS Non "Fabrikam" !contains "xyz"
contains_cs RHS apparaît comme une sous-séquence de LHS Oui "FabriKam" contains_cs "Kam"
!contains_cs RHS ne figure pas dans LHS Oui "Fabrikam" !contains_cs "Kam"
endswith RHS est une sous-séquence fermante de LHS Non "Fabrikam" endswith "Kam"
!endswith RHS n’est pas une sous-séquence fermante de LHS Non "Fabrikam" !endswith "brik"
endswith_cs RHS est une sous-séquence fermante de LHS Oui "Fabrikam" endswith_cs "kam"
!endswith_cs RHS n’est pas une sous-séquence fermante de LHS Oui "Fabrikam" !endswith_cs "brik"
has Le terme de droite est un terme entier dans le terme de gauche Non "North America" has "america"
!has Le terme de droite n'est pas un terme entier à gauche Non "North America" !has "amer"
has_all Identique à has, mais fonctionne sur tous les éléments Non "North and South America" has_all("south", "north")
has_any Identique à has mais fonctionne sur tous les éléments Non "North America" has_any("south", "north")
has_cs Le terme de droite est un terme entier à gauche Oui "North America" has_cs "America"
!has_cs Le terme de droite n'est pas un terme entier à gauche Oui "North America" !has_cs "amer"
hasprefix Le terme de droite est un préfixe à gauche Non "North America" hasprefix "ame"
!hasprefix Le terme de droite n'est pas un préfixe à gauche Non "North America" !hasprefix "mer"
hasprefix_cs Le terme de droite est un préfixe à gauche Oui "North America" hasprefix_cs "Ame"
!hasprefix_cs Le terme de droite n'est pas un préfixe à gauche Oui "North America" !hasprefix_cs "CA"
hassuffix Le terme de droite est un suffixe à gauche Non "North America" hassuffix "ica"
!hassuffix Le terme de droite n'est pas un suffixe à gauche Non "North America" !hassuffix "americ"
hassuffix_cs Le terme de droite est un suffixe à gauche Oui "North America" hassuffix_cs "ica"
!hassuffix_cs Le terme de droite n'est pas un suffixe à gauche Oui "North America" !hassuffix_cs "icA"
in Est égal à l’un des éléments Oui "abc" in ("123", "345", "abc")
!in N’est égal à aucun des éléments Oui "bca" !in ("123", "345", "abc")
in~ Est égal à l’un des éléments Non "Abc" in~ ("123", "345", "abc")
!in~ N’est égal à aucun des éléments Non "bCa" !in~ ("123", "345", "ABC")
matches regex LHS contient une correspondance pour RHS Oui "Fabrikam" matches regex "b.*k"
startswith RHS est une sous-séquence initiale de LHS Non "Fabrikam" startswith "fab"
!startswith RHS n’est pas une sous-séquence initiale de LHS Non "Fabrikam" !startswith "kam"
startswith_cs RHS est une sous-séquence initiale de LHS Oui "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS n’est pas une sous-séquence initiale de LHS Oui "Fabrikam" !startswith_cs "fab"

Conseils sur les performances

Pour de meilleures performances, lorsque deux opérateurs effectuent la même tâche, utilisez celui qui respecte la casse. Par exemple :

  • Utilisez ==, pas =~
  • Utilisez in, pas in~
  • Utilisez hassuffix_cs, pas hassuffix

Pour des résultats plus rapides, si vous recherchez la présence d'un symbole ou d'un mot alphanumérique délimité par des caractères non alphanumériques, ou le début ou la fin d'un champ, utilisez has ou in. has effectue la recherche plus rapidement que contains, startswith ou endswith.

Pour rechercher des adresses IPv4 ou leurs préfixes, utilisez l’un des opérateurs spéciaux sur les adresses IPv4, qui sont optimisés à cet effet.

Pour plus d’informations, consultez Bonnes pratiques relatives aux requêtes.

Par exemple, la première de ces requêtes sera plus rapide :

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

Opérateurs sur les adresses IPv4

Le groupe d’opérateurs suivant fournit une recherche accélérée par index sur les adresses IPv4 ou leurs préfixes.

Opérateur Description Exemple (génère true)
has_ipv4 LHS contient l’adresse IPv4 représentée par RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS contient une adresse IPv4 qui correspond à un préfixe représenté par RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS contient l’une des adresses IPv4 fournies par 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 contient une adresse IPv4 qui correspond à l’un des préfixes fournis par RHS has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))