Opérateur find
Recherche les lignes qui correspondent à un prédicat dans un ensemble de tables.
L’étendue de find
peut également être inter-base de données ou entre clusters.
find in (Table1, Table2, Table3) where Fruit=="apple"
find in (database('*').*) where Fruit == "apple"
find in (cluster('cluster_name').database('MyDB*').*) where Fruit == "apple"
find in (Table1, Table2, Table3) where Fruit=="apple"
Notes
find
l’opérateur est sensiblement moins efficace que le filtrage de texte spécifique à une colonne. Chaque fois que les colonnes sont connues, nous vous recommandons d’utiliser l’opérateur where. find
ne fonctionne pas correctement lorsque l’espace de travail contient un grand nombre de tables et de colonnes, que le volume de données analysé est élevé et que l’intervalle de temps de la requête est élevé.
Syntax
find
[withsource
= ColumnName] [in
(
Tables)
]where
Prédicat [project-smart
|project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]]find
Prédicat [project-smart
|project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]]
Découvrez les conventions de syntaxe.
Paramètres
Nom | Type | Obligatoire | Description |
---|---|---|---|
ColumnName | string |
Par défaut, la sortie inclut une colonne appelée source_ dont les valeurs indiquent la table source qui a contribué à chaque ligne. S’il est spécifié, ColumnName sera utilisé à la place de source_. Après la mise en correspondance de caractères génériques, si la requête référence des tables de plusieurs bases de données, y compris la base de données par défaut, la valeur de cette colonne aura un nom de table qualifié avec la base de données. De même, les qualifications de cluster et de base de données seront présentes dans la valeur si plusieurs clusters sont référencés. | |
Predicate | bool |
✔️ | Cette expression booléenne est évaluée pour chaque ligne de chaque table d’entrée. Pour plus d’informations, consultez détails de la syntaxe du prédicat. |
Tables | string |
Zéro ou plusieurs références de table séparées par des virgules. Par défaut, find recherche dans toutes les tables de la base de données active. Vous pouvez utiliser :1. Nom d’une table, par exemple Events 2. Une expression de requête, telle que (Events | where id==42) 3. Ensemble de tables spécifiées avec un caractère générique. Par exemple, E* formerait l’union de toutes les tables de la base de données dont les noms commencent par E . |
|
project-smart ou project |
string |
S’il n’est pas spécifié, project-smart sera utilisé par défaut. Pour plus d’informations, consultez détails du schéma de sortie. |
withsource=
ColumnName : facultatif. Par défaut, la sortie inclut une colonne appelée source_ dont les valeurs indiquent la table source qui a contribué à chaque ligne. S’il est spécifié, ColumnName sera utilisé à la place de source_.Prédicat :
boolean
expression sur les colonnes des tables d’entrée Table [,
Table, ...]. Il est évalué pour chaque ligne de chaque table d’entrée. Pour plus d’informations, consultez détails de la syntaxe du prédicat.Tables : facultatif. Zéro ou plusieurs références de table séparées par des virgules. Par défaut , la recherche recherche toutes les tables pour :
- Nom d’une table, par exemple,
Events
- Expression de requête, telle que
(Events | where id==42)
- Ensemble de tables spécifié par un caractère générique. Par exemple,
E*
formerait l’union de toutes les tables dont les noms commencent parE
.
- Nom d’une table, par exemple,
project-smart
|project
: s’il n’est pas spécifiéproject-smart
, sera utilisé par défaut. Pour plus d’informations, consultez détails du schéma de sortie.
Retours
Transformation des lignes dans la table [,
Table, ...] pour lesquelles le prédicat est true
. Les lignes sont transformées en fonction du schéma de sortie.
Schéma de sortie
colonne source_
La sortie de l’opérateur de recherche inclut toujours une colonne source_ avec le nom de la table source. La colonne peut être renommée à l’aide du withsource
paramètre .
colonnes de résultats
Les tables sources qui ne contiennent aucune colonne utilisée par l’évaluation du prédicat seront filtrées.
Lorsque vous utilisez project-smart
, les colonnes qui s’affichent dans la sortie sont les suivantes :
- Colonnes qui apparaissent explicitement dans le prédicat.
- Colonnes communes à toutes les tables filtrées.
Le reste des colonnes est emballé dans un conteneur de propriétés et s’affiche dans une colonne supplémentaire pack
.
Une colonne référencée explicitement par le prédicat et qui apparaît dans plusieurs tables avec plusieurs types aura une colonne différente dans le schéma de résultat pour chaque type de ce type. Chacun des noms de colonne sera construit à partir du nom et du type de colonne d’origine, séparés par un trait de soulignement.
Lors de l’utilisation de project
ColumnName[:
ColumnType,
... ] [,
pack_all()
] :
- La table de résultats inclut les colonnes spécifiées dans la liste. Si une table source ne contient pas de colonne spécifique, les valeurs dans les lignes correspondantes sont null.
- Lors de la spécification d’un ColumnType avec un ColumnName, cette colonne dans le « result » aura le type donné et les valeurs seront castées en ce type si nécessaire. La conversion n’aura pas d’effet sur le type de colonne lors de l’évaluation du prédicat.
- Quand
pack_all()
est utilisé, toutes les colonnes, y compris les colonnes projetées, sont regroupées dans un conteneur de propriétés et apparaissent dans une colonne supplémentaire, par défaut « column1 ». Dans le conteneur de propriétés, le nom de la colonne source sert de nom de propriété et la valeur de la colonne sert de valeur de propriété.
Syntaxe du prédicat
L’opérateur find prend en charge une autre syntaxe pour le * has
terme, et l’utilisation d’un terme simple permet de rechercher un terme dans toutes les colonnes d’entrée.
Pour obtenir un résumé de certaines fonctions de filtrage, consultez opérateur where.
Notes
- Si la
project
clause fait référence à une colonne qui apparaît dans plusieurs tables et a plusieurs types, un type doit suivre cette référence de colonne dans la clause de projet - Si une colonne apparaît dans plusieurs tables et a plusieurs types et
project-smart
est en cours d’utilisation, il y aura une colonne correspondante pour chaque type dans lefind
résultat de , comme décrit dans union - Lorsque vous utilisez project-smart, les modifications apportées au prédicat, au jeu de tables sources ou au schéma des tables peuvent entraîner une modification du schéma de sortie. Si un schéma de résultat constant est nécessaire, utilisez project à la place
find
l’étendue ne peut pas inclure de fonctions. Pour inclure une fonction dans l’étendue de recherche, définissez une instruction let avec affichage mot clé.
Conseils sur les performances
- Utilisez des tables plutôt que des expressions tabulaires.
Si l’expression tabulaire, l’opérateur de recherche revient à une
union
requête qui peut entraîner une dégradation des performances. - Si une colonne qui apparaît dans plusieurs tables et a plusieurs types fait partie de la clause de projet, préférez ajouter un ColumnType à la clause de projet plutôt que de modifier la table avant de la passer à
find
. - Ajoutez des filtres basés sur le temps au prédicat. Utilisez une valeur de colonne datetime ou ingestion_time().
- Recherchez dans des colonnes spécifiques plutôt que dans une recherche en texte intégral.
- Il est préférable de ne pas référencer les colonnes qui apparaissent dans plusieurs tables et qui ont plusieurs types. Si le prédicat est valide lors de la résolution de ce type de colonnes pour plusieurs types, la requête revient à l’union. Par exemple, consultez des exemples de cas où la recherche fera office d’union.
Exemples
Recherche de termes dans toutes les tables de la base de données active
La requête recherche toutes les lignes de toutes les tables de la base de données active dans laquelle une colonne inclut le mot Hernandez
. Les enregistrements résultants sont transformés en fonction du schéma de sortie. La sortie inclut les lignes de la Customers
table et de la SalesTable
table de la ContosoSales
base de données.
find "Hernandez"
Recherche de termes dans toutes les tables correspondant à un modèle de nom dans la base de données active
La requête recherche toutes les lignes de toutes les tables de la base de données active dont le nom commence par C
et dans laquelle toute colonne inclut le mot Hernandez
. Les enregistrements résultants sont transformés en fonction du schéma de sortie. Désormais, la sortie contient uniquement les enregistrements de la Customers
table.
find in (C*) where * has "Hernandez"
Recherche de termes dans toutes les tables de toutes les bases de données du cluster
La requête recherche toutes les lignes de toutes les tables de toutes les bases de données dans lesquelles une colonne inclut le mot Kusto
.
Cette requête est une requête inter-bases de données .
Les enregistrements résultants sont transformés en fonction du schéma de sortie.
find in (database('*').*) where * has "Kusto"
Recherche de termes dans toutes les tables et bases de données correspondant à un modèle de nom dans le cluster
La requête recherche toutes les lignes de toutes les tables dont le nom commence par K
dans toutes les bases de données dont le nom commence par B
et dans lesquelles une colonne inclut le mot Kusto
.
Les enregistrements résultants sont transformés en fonction du schéma de sortie.
find in (database("S*").C*) where * has "Kusto"
Recherche de termes dans plusieurs clusters
La requête recherche toutes les lignes de toutes les tables dont le nom commence par K
dans toutes les bases de données dont le nom commence par B
et dans lesquelles une colonne inclut le mot Kusto
.
Les enregistrements résultants sont transformés en fonction du schéma de sortie.
find in (cluster("cluster1").database("B*").K*, cluster("cluster2").database("C*".*))
where * has "Kusto"
Recherche de termes dans toutes les tables
La requête recherche toutes les lignes de toutes les tables dans lesquelles une colonne inclut le mot Kusto
.
Les enregistrements résultants sont transformés en fonction du schéma de sortie.
find "Kusto"
Exemples de résultats de find
sortie
Les exemples suivants montrent comment find
être utilisé sur deux tables : EventsTable1 et EventsTable2.
Supposons que nous avons le contenu suivant de ces deux tables :
EventsTable1
Session_id | Level | EventText | Version |
---|---|---|---|
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Information | Un peu de texte1 | v1.0.0 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Erreur | Un peu de texte2 | v1.0.0 |
28b8e46e-3c31-43cf-83cb-48921c3986fc | Erreur | Un peu de texte3 | v1.0.1 |
8f057b11-3281-45c3-a856-05ebb18a3c59 | Information | Un peu de texte4 | v1.1.0 |
EventsTable2
Session_id | Level | EventText | EventName |
---|---|---|---|
f7d5f95f-f580-4ea6-830b-5776c8d64fdd | Information | Autre texte1 | Événement1 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Information | Autre texte2 | Événement2 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Erreur | Autre texte3 | Événement3 |
15eaeab5-8576-4b58-8fc6-478f75d8fee4 | Erreur | Autres textes4 | Événement4 |
Rechercher dans des colonnes courantes, projeter des colonnes communes et rares, et empaquetez le reste
find in (EventsTable1, EventsTable2)
where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' and Level == 'Error'
project EventText, Version, EventName, pack_all()
Sortie
Source_ | EventText | Version | EventName | Pack_ |
---|---|---|---|---|
EventsTable1 | Un peu de texte2 | v1.0.0 | {"Session_Id » :"acbd207d-51aa-4df7-bfa7-be70eb68f04e », « Level » :"Error"} | |
EventsTable2 | Autre texte3 | Événement3 | {"Session_Id » :"acbd207d-51aa-4df7-bfa7-be70eb68f04e », « Level » :"Error"} |
Rechercher dans des colonnes courantes et peu courantes
find Version == 'v1.0.0' or EventName == 'Event1' project Session_Id, EventText, Version, EventName
Sortie
Source_ | Session_id | EventText | Version | EventName |
---|---|---|---|---|
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Un peu de texte1 | v1.0.0 | |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Un peu de texte2 | v1.0.0 | |
EventsTable2 | f7d5f95f-f580-4ea6-830b-5776c8d64fdd | Autre texte1 | Événement1 |
Remarque : dans la pratique, les lignes EventsTable1 sont filtrées avec Version == 'v1.0.0'
un prédicat et les lignes EventsTable2 sont filtrées avec EventName == 'Event1'
le prédicat.
Utiliser la notation abrégée pour effectuer des recherches dans toutes les tables de la base de données active
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
Sortie
Source_ | Session_id | Level | EventText | Pack_ |
---|---|---|---|---|
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Information | Un peu de texte1 | {"Version » :"v1.0.0"} |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Erreur | Un peu de texte2 | {"Version » :"v1.0.0"} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Information | Autre texte2 | {"EventName » :"Event2"} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Erreur | Autre texte3 | {"EventName » :"Event3"} |
Retourner les résultats de chaque ligne en tant que conteneur de propriétés
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' project pack_all()
Sortie
Source_ | Pack_ |
---|---|
EventsTable1 | {"Session_Id » :"acbd207d-51aa-4df7-bfa7-be70eb68f04e », « Level » :"Information », « EventText » :"Some Text1 », « Version » :"v1.0.0"} |
EventsTable1 | {"Session_Id » :"acbd207d-51aa-4df7-bfa7-be70eb68f04e », « Level » :"Error », « EventText » :"Some Text2 », « Version » :"v1.0.0"} |
EventsTable2 | {"Session_Id » :"acbd207d-51aa-4df7-bfa7-be70eb68f04e », « Level » :"Information », « EventText » :"Some Other Text2 », « EventName » :"Event2"} |
EventsTable2 | {"Session_Id » :"acbd207d-51aa-4df7-bfa7-be70eb68f04e », « Level » :"Error », « EventText » :"Some Other Text3 », « EventName » :"Event3"} |
Exemples de cas où find
agira comme union
Utilisation d’une expression non tabulaire comme opérande de recherche
let PartialEventsTable1 = view() { EventsTable1 | where Level == 'Error' };
find in (PartialEventsTable1, EventsTable2)
where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
Référencement d’une colonne qui apparaît dans plusieurs tables et a plusieurs types
Supposons que nous ayons créé deux tables en exécutant :
.create tables
Table1 (Level:string, Timestamp:datetime, ProcessId:string),
Table2 (Level:string, Timestamp:datetime, ProcessId:int64)
- La requête suivante est exécutée en tant que
union
.
find in (Table1, Table2) where ProcessId == 1001
Le schéma de résultat de sortie sera (Level :string, Timestamp, ProcessId_string, ProcessId_int) .
- La requête suivante sera également exécutée en tant que
union
, mais produira un schéma de résultat différent.
find in (Table1, Table2) where ProcessId == 1001 project Level, Timestamp, ProcessId:string
Le schéma de résultat de sortie sera (Level :string, Timestamp, ProcessId_string)
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour