Share via


find-operatorn

Söker efter rader som matchar ett predikat i en uppsättning tabeller.

Omfånget för find kan också vara korsdatabaser eller korskluster.

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"

Anteckning

find operatorn är betydligt mindre effektiv än kolumnspecifik textfiltrering. När kolumnerna är kända rekommenderar vi att du använder operatorn where. find fungerar inte bra när arbetsytan innehåller ett stort antal tabeller och kolumner och datavolymen som genomsöks är hög och tidsintervallet för frågan är högt.

Syntax

  • find [withsource= ColumnName] [in(Tabeller)] wherePredikat [project-smart | projectColumnName[:ColumnType, ... ] [,pack_all()]]

  • findPredikat [project-smart | projectColumnName[:ColumnType, ... ] [,pack_all()]]

Läs mer om syntaxkonventioner.

Parametrar

Namn Typ Obligatorisk Beskrivning
Columnname string Som standard innehåller utdata en kolumn med namnet source_ vars värden anger vilken källtabell som har bidragit med varje rad. Om detta anges används ColumnName i stället för source_. Om frågan refererar till tabeller från fler än en databas, inklusive standarddatabasen, efter jokerteckenmatchning har värdet för den här kolumnen ett tabellnamn som är kvalificerat med databasen. På samma sätt finns kluster- och databaskvalifikationer i värdet om fler än ett kluster refereras till.
Predikat bool ✔️ Det här booleska uttrycket utvärderas för varje rad i varje indatatabell. Mer information finns i information om predikatsyntax.
Tabeller string Noll eller fler kommaavgränsade tabellreferenser. Som standard find visas alla tabeller i den aktuella databasen. Du kan använda:
1. Namnet på en tabell, till exempel Events
2. Ett frågeuttryck, till exempel (Events | where id==42)
3. En uppsättning tabeller som anges med jokertecken. Skulle till exempel E* bilda en union av alla tabeller i databasen vars namn börjar med E.
project-smart eller project string Om inget anges project-smart används som standard. Mer information finns i information om output-schema.
  • withsource=ColumnName: Valfritt. Som standard innehåller utdata en kolumn med namnet source_ vars värden anger vilken källtabell som bidrog med varje rad. Om detta anges används ColumnName i stället för source_.

  • Predikat: Ett booleanuttryck över kolumnerna i indatatabellerna Tabell [,Tabell, ...]. Den utvärderas för varje rad i varje indatatabell. Mer information finns i information om predikatsyntax.

  • Tabeller: Valfritt. Noll eller fler kommaavgränsade tabellreferenser. Som standard söker find i alla tabeller efter:

    • Namnet på en tabell, till exempel Events
    • Ett frågeuttryck, till exempel (Events | where id==42)
    • En uppsättning tabeller som anges med jokertecken. Skulle till exempel E* bilda en union av alla tabeller vars namn börjar med E.
  • project-smart | project: Om inget anges project-smart används som standard. Mer information finns i information om output-schema.

Returer

Transformering av rader i tabell [,Tabell, ...] för vilka Predikat är true. Raderna transformeras enligt utdataschemat.

Utdataschema

source_ kolumn

Sökoperatorns utdata innehåller alltid en source_ kolumn med källtabellens namn. Kolumnen kan byta namn med hjälp av parametern withsource .

resultatkolumner

Källtabeller som inte innehåller någon kolumn som används av predikatutvärderingen filtreras bort.

När du använder project-smartblir kolumnerna som visas i utdata:

  • Kolumner som uttryckligen visas i predikatet.
  • Kolumner som är gemensamma för alla filtrerade tabeller.

Resten av kolumnerna packas i en egenskapsuppsättning och visas i ytterligare pack en kolumn. En kolumn som uttryckligen refereras till av predikatet och som visas i flera tabeller med flera typer, har en annan kolumn i resultatschemat för varje sådan typ. Vart och ett av kolumnnamnen skapas från det ursprungliga kolumnnamnet och typen, avgränsade med ett understreck.

När du använder projectColumnName[:ColumnType, ... ] [,pack_all()]:

  • Resultattabellen innehåller de kolumner som anges i listan. Om en källtabell inte innehåller en viss kolumn är värdena på motsvarande rader null.
  • När du anger en ColumnType med ett ColumnName kommer den här kolumnen i "result" att ha den angivna typen och värdena kommer att omvandlas till den typen om det behövs. Omvandlingen påverkar inte kolumntypen vid utvärdering av predikatet.
  • När pack_all() används packas alla kolumner, inklusive de projicerade kolumnerna, i en egenskapsuppsättning och visas i ytterligare en kolumn, som standard kolumn1. I egenskapsuppsättningen fungerar källkolumnnamnet som egenskapsnamn och kolumnens värde fungerar som egenskapsvärde.

Predikatsyntax

Find-operatorn stöder en alternativ syntax för * has termen, och med bara term söker en term i alla indatakolumner.

En sammanfattning av vissa filtreringsfunktioner finns i var operatorn finns.

Kommentarer

  • project Om satsen refererar till en kolumn som visas i flera tabeller och har flera typer, måste en typ följa den här kolumnreferensen i projektsatsen
  • Om en kolumn visas i flera tabeller och har flera typer och project-smart används, kommer det att finnas en motsvarande kolumn för varje typ i resultatet, enligt beskrivningen findi union
  • När du använder projektsmart kan ändringar i predikatet, i källtabelluppsättningen eller i tabellschemat resultera i en ändring av utdataschemat. Om du behöver ett konstant resultatschema använder du projektet i stället
  • find omfånget kan inte innehålla funktioner. Om du vill inkludera en funktion i sökomfånget definierar du en let-instruktion med visa nyckelord.

Prestandatips

  • Använd tabeller i stället för tabelluttryck. Om tabelluttrycket returnerar find-operatorn en union fråga som kan resultera i försämrad prestanda.
  • Om en kolumn som visas i flera tabeller och har flera typer, är en del av projektsatsen, föredrar du att lägga till en ColumnType i projektsatsen framför att ändra tabellen innan den skickas till find.
  • Lägg till tidsbaserade filter i predikatet. Använd ett datetime-kolumnvärde eller ingestion_time().
  • Sök i specifika kolumner i stället för en fulltextsökning.
  • Det är bättre att inte referera till kolumner som visas i flera tabeller och har flera typer. Om predikatet är giltigt när du löser typen av sådana kolumner för mer än en typ återgår frågan till union. Se till exempel exempel på fall där fynd fungerar som en union.

Exempel

Termsökning i alla tabeller i den aktuella databasen

Frågan hittar alla rader från alla tabeller i den aktuella databasen där valfri kolumn innehåller ordet Hernandez. De resulterande posterna transformeras enligt utdataschemat. Utdata innehåller rader från Customers tabellen och SalesTable tabellen i ContosoSales databasen.

find "Hernandez"

Termsökning i alla tabeller som matchar ett namnmönster i den aktuella databasen

Frågan hittar alla rader från alla tabeller i den aktuella databasen vars namn börjar med Coch i vilken kolumn som helst innehåller ordet Hernandez. De resulterande posterna transformeras enligt utdataschemat. Nu innehåller utdata bara poster från Customers tabellen.

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

Termsökning i alla tabeller i alla databaser i klustret

Frågan hittar alla rader från alla tabeller i alla databaser där en kolumn innehåller ordet Kusto. Den här frågan är en fråga mellan databaser . De resulterande posterna transformeras enligt utdataschemat.

find in (database('*').*) where * has "Kusto"

Termsökning i alla tabeller och databaser som matchar ett namnmönster i klustret

Frågan hittar alla rader från alla tabeller vars namn börjar med K i alla databaser vars namn börjar med B och i vilka kolumner som helst innehåller ordet Kusto. De resulterande posterna transformeras enligt utdataschemat.

find in (database("S*").C*) where * has "Kusto"

Termsökning i flera kluster

Frågan hittar alla rader från alla tabeller vars namn börjar med K i alla databaser vars namn börjar med B och i vilka kolumner som helst innehåller ordet Kusto. De resulterande posterna transformeras enligt utdataschemat.

find in (cluster("cluster1").database("B*").K*, cluster("cluster2").database("C*".*))
where * has "Kusto"

Termsökning i alla tabeller

Frågan hittar alla rader från alla tabeller där en kolumn innehåller ordet Kusto. De resulterande posterna transformeras enligt utdataschemat.

find "Kusto"

Exempel på find utdataresultat

Följande exempel visar hur find du kan användas över två tabeller: EventsTable1 och EventsTable2. Anta att vi har nästa innehåll i dessa två tabeller:

EventsTable1

Session_Id Nivå EventText Version
acbd207d-51aa-4df7-bfa7-be70eb68f04e Information Viss text1 v1.0.0
acbd207d-51aa-4df7-bfa7-be70eb68f04e Fel Viss text 2 v1.0.0
28b8e46e-3c31-43cf-83cb-48921c3986fc Fel Viss text 3 v1.0.1
8f057b11-3281-45c3-a856-05ebb18a3c59 Information Viss text 4 v1.1.0

EventsTable2

Session_Id Nivå EventText EventName
f7d5f95f-f580-4ea6-830b-5776c8d64fdd Information Viss annan text1 Händelse 1
acbd207d-51aa-4df7-bfa7-be70eb68f04e Information Annan text 2 Händelse 2
acbd207d-51aa-4df7-bfa7-be70eb68f04e Fel Annan text 3 Händelse 3
15eaeab5-8576-4b58-8fc6-478f75d8fee4 Fel Annan text 4 Händelse 4

Sök i vanliga kolumner, projicera vanliga och ovanliga kolumner och packa resten

find in (EventsTable1, EventsTable2) 
     where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' and Level == 'Error' 
     project EventText, Version, EventName, pack_all()

Resultat

Källkod_ EventText Version EventName Pack_
EventsTable1 Viss text 2 v1.0.0 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"}
EventsTable2 Annan text 3 Händelse 3 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"}

Sök i vanliga och ovanliga kolumner

find Version == 'v1.0.0' or EventName == 'Event1' project Session_Id, EventText, Version, EventName

Resultat

Källkod_ Session_Id EventText Version EventName
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Viss text1 v1.0.0
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Viss text 2 v1.0.0
EventsTable2 f7d5f95f-f580-4ea6-830b-5776c8d64fdd Viss annan text1 Händelse 1

Obs! I praktiken filtreras EventsTable1-rader med Version == 'v1.0.0' predikat och EventsTable2-rader filtreras med EventName == 'Event1' predikat.

Använd förkortad notation för att söka i alla tabeller i den aktuella databasen

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

Resultat

Källkod_ Session_Id Nivå EventText Pack_
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Information Viss text1 {"Version":"v1.0.0"}
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Fel Viss text2 {"Version":"v1.0.0"}
EventsTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Information Viss annan text2 {"EventName":"Event2"}
EventsTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Fel Annan text 3 {"EventName":"Event3"}

Returnera resultaten från varje rad som en egenskapsuppsättning

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

Resultat

Källkod_ 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"}

Exempel på fall där find kommer att fungera som union

Använda ett icke-tabelluttryck som sökoperand

let PartialEventsTable1 = view() { EventsTable1 | where Level == 'Error' };
find in (PartialEventsTable1, EventsTable2) 
     where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'

Referera till en kolumn som visas i flera tabeller och har flera typer

Anta att vi har skapat två tabeller genom att köra:

.create tables 
  Table1 (Level:string, Timestamp:datetime, ProcessId:string),
  Table2 (Level:string, Timestamp:datetime, ProcessId:int64)
  • Följande fråga körs som union.
find in (Table1, Table2) where ProcessId == 1001

Utdataresultatschemat blir (Level:string, Timestamp, ProcessId_string, ProcessId_int).

  • Följande fråga körs också som union, men genererar ett annat resultatschema.
find in (Table1, Table2) where ProcessId == 1001 project Level, Timestamp, ProcessId:string 

Utdataresultatschemat blir (Level:string, Timestamp, ProcessId_string)