Partager via


Opérateur find

S’applique à : ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

Recherche des lignes qui correspondent à un prédicat sur un ensemble de tables.

L’étendue de la base find de données peut également être inter-bases de données ou inter-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"

Remarque

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 et que le volume de données analysé est élevé et que l’intervalle de temps de la requête est élevé.

Syntaxe

  • find[withsource= ColumnName] [in( Tables)] where Predicate [project-smart | project ColumnName[: ColumnType , ... ] [, pack_all()]]

  • findPrédicat [project-smart | project ColumnName[: ColumnType , ... ] [, pack_all()]]

En savoir plus sur les conventions de syntaxe.

Paramètres

Nom Type Requise Description
ColumnName string Par défaut, la sortie inclut une colonne appelée source_ dont les valeurs indiquent quelle table source a contribué à chaque ligne. Si spécifié, ColumnName est utilisé au lieu de source_. Après la mise en correspondance de caractères génériques, si la requête fait 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 sont présentes dans la valeur si plusieurs clusters sont référencés.
Prédicat bool ✔️ Cette expression booléenne est évaluée pour chaque ligne de chaque table d’entrée. Pour plus d’informations, consultez les détails de la syntaxe des prédicats.
Tables string Zéro ou plusieurs références de table séparées par des virgules. Par défaut, find recherche toutes les tables de la base de données active. Vous pouvez utiliser :
1. Nom d’une table, par exemple Events
2. 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 Si ce n’est pas spécifié, project-smart sera utilisé par défaut. Pour plus d’informations, consultez les 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. Si spécifié, ColumnName est utilisé au lieu de source_.

  • Prédicat : expression boolean sur les colonnes de la table des tables d’entrée [, Table, ...]. Elle est évaluée pour chaque ligne de chaque table d’entrée. Pour plus d’informations, consultez les détails de la syntaxe des prédicats.

  • 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 :

    • 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 par E.
  • project-smart | project: s’il n’est pas spécifié project-smart , il est utilisé par défaut. Pour plus d’informations, consultez les détails du schéma de sortie.

Retours

Transformation des lignes dans la table [, Table, ...] pour laquelle 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 find 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 apparaissent 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 sera emballé dans un conteneur de propriétés et apparaîtra 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 colonnes 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 ColumnName[: ColumnType , ... ] [ pack_all(), ] :project

  • 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 des lignes correspondantes sont null.
  • Lorsque vous spécifiez un ColumnType avec un ColumnName, cette colonne dans le « résultat » aura le type donné et les valeurs seront converties en ce type si nécessaire. Le cast n’aura pas d’effet sur le type de colonne lors de l’évaluation du prédicat.
  • Quand pack_all() elle est utilisée, toutes les colonnes, y compris les colonnes projetées, sont empaqueté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 colonne source sert de nom de propriété et la valeur de la colonne sert de valeur de propriété.

Syntaxe de prédicat

L’opérateur find prend en charge une autre syntaxe pour le * has terme et utilise simplement un terme, recherche un terme dans toutes les colonnes d’entrée.

Pour obtenir un résumé de certaines fonctions de filtrage, voir où l’opérateur.

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 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 du findrésultat, comme décrit dans union
  • Lorsque vous utilisez project-smart, les modifications apportées au prédicat, dans le jeu de tables sources ou dans le 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 le projet à 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 le mot clé View.

Astuces pour 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 comporte plusieurs types, fait partie de la clause projet, préférez ajouter un ColumnType à la clause de projet par rapport à la modification de 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 qu’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 à union. Par exemple, consultez des exemples de cas où la recherche agit en tant qu’union.

Exemples

Recherche de termes sur 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 n’importe quelle colonne inclut le mot Hernandez. Les enregistrements résultants sont transformés en fonction du schéma de sortie. La sortie inclut des lignes de la Customers table et de SalesTable la table de la ContosoSales base de données.

find "Hernandez"

Recherche de termes sur 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 n’importe quelle colonne inclut le mot Hernandez. Les enregistrements résultants sont transformés en fonction du schéma de sortie. À présent, la sortie contient uniquement les enregistrements de la Customers table.

find in (C*) where * has "Hernandez"

Recherche de termes sur 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 n’importe quelle 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 sur 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 dans toutes les bases de données dont le nom commence K B par et dans lequel n’importe quelle 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 dans toutes les bases de données dont le nom commence K B par et dans lequel n’importe quelle 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 sur toutes les tables

La requête recherche toutes les lignes de toutes les tables dans lesquelles n’importe quelle 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 utiliser sur deux tables : EventsTable1 et EventsTable2. Supposons que nous avons le contenu suivant de ces deux tables :

EventsTable1

Session_Id Niveau EventText Version
acbd207d-51aa-4df7-bfa7-be70eb68f04e Information Texte1 v1.0.0
acbd207d-51aa-4df7-bfa7-be70eb68f04e Error Texte2 v1.0.0
28b8e46e-3c31-43cf-83cb-48921c3986fc Error Texte3 v1.0.1
8f057b11-3281-45c3-a856-05ebb18a3c59 Information Texte4 v1.1.0

EventsTable2

Session_Id Niveau 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 Error Autre texte3 Événement3
15eaeab5-8576-4b58-8fc6-478f75d8fee4 Error Autre texte4 Event4

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 emballer_
EventsTable1 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 rares

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 Texte1 v1.0.0
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Texte2 v1.0.0
EventsTable2 f7d5f95f-f580-4ea6-830b-5776c8d64fdd Autre texte1 Événement1

Remarque : dans la pratique, les lignes EventsTable1 seront filtrées avec Version == 'v1.0.0' le prédicat et les lignes EventsTable2 seront filtrées avec EventName == 'Event1' le prédicat.

Utiliser la notation abrégée pour effectuer une recherche dans toutes les tables de la base de données active

find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'

Sortie

source_ Session_Id Niveau EventText emballer_
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Information Texte1 {"Version » :"v1.0.0"}
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Error Texte2 {"Version » :"v1.0.0"}
EventsTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Information Autre texte2 {"EventName » :"Event2"}
EventsTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Error Autre texte3 {"EventName » :"Event3"}

Renvoyer les résultats de chaque ligne sous forme de conteneur de propriétés

find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' project pack_all()

Sortie

source_ emballer_
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 agir en tant que 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 qui a plusieurs types

Supposons que nous avons 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 est (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 est (Level :string, Timestamp, ProcessId_string)