Sdílet prostřednictvím


Operátor find

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Najde řádky, které odpovídají predikátu v sadě tabulek.

Rozsahem find může být také mezi databázemi nebo mezi clustery.

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"

Poznámka:

find operátor je podstatně méně efektivní než filtrování textu specifického pro sloupec. Vždy, když jsou sloupce známé, doporučujeme použít operátor where. find nebude fungovat dobře, pokud pracovní prostor obsahuje velký počet tabulek a sloupců a objem dat, který se kontroluje, je vysoký a časový rozsah dotazu je vysoký.

Syntaxe

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

  • findPredikát [project-smart | project ColumnName[: ColumnType , ... ] [, pack_all()]]

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
ColumnName string Ve výchozím nastavení bude výstup obsahovat sloupec s názvem source_ , jehož hodnoty označují, která zdrojová tabulka přispěla ke každému řádku. Pokud zadáte, použije se místo source_ ColumnName. Pokud dotaz odkazuje na tabulky z více než jedné databáze, včetně výchozí databáze, bude mít hodnota tohoto sloupce název tabulky kvalifikovaný pro databázi. Podobně budou kvalifikace clusteru a databáze k dispozici v hodnotě, pokud se odkazuje na více než jeden cluster.
Predikát bool ✔️ Tento logický výraz se vyhodnotí pro každý řádek v každé vstupní tabulce. Další informace najdete v podrobnostech o syntaxi predikátu.
Tabulky string Nula nebo více odkazů na tabulky oddělené čárkami. Ve výchozím nastavení find bude vypadat ve všech tabulkách v aktuální databázi. Můžete použít:
1. Název tabulky, například Events
2. Výraz dotazu, například (Events | where id==42)
3. Sada tabulek zadaná zástupným znakem. Například E* by vytvořil sjednocení všech tabulek v databázi, jejichž názvy začínají E.
project-smart nebo project string Pokud není zadáno, project-smart použije se ve výchozím nastavení. Další informace najdete v podrobnostech o výstupním schématu.
  • withsource=Název sloupce: Nepovinný. Ve výchozím nastavení bude výstup obsahovat sloupec s názvem source_ jehož hodnoty označují, která zdrojová tabulka přispěla každým řádkem. Pokud zadáte, použije se místo source_ ColumnName.

  • Predikát: boolean Výraz nad sloupci vstupních tabulek Tabulka [, Tabulka, ...]. Vyhodnocuje se pro každý řádek v každé vstupní tabulce. Další informace najdete v podrobnostech o syntaxi predikátu.

  • Tabulky: Volitelné. Nula nebo více odkazů na tabulky oddělené čárkami. Ve výchozím nastavení vyhledá všechny tabulky pro:

    • Název tabulky, například Events
    • Výraz dotazu, například (Events | where id==42)
    • Sada tabulek zadaná zástupným znakem Například E* by vytvořil sjednocení všech tabulek, jejichž názvy začínají E.
  • project-smart | project: Pokud nezadáte project-smart , použije se ve výchozím nastavení. Další informace najdete v podrobnostech o výstupním schématu.

Návraty

Transformace řádků v tabulce [, Tabulka, ...] pro které je truepredikát . Řádky se transformují podle výstupního schématu.

Výstupní schéma

sloupec source_

Výstup operátoru hledání bude vždy obsahovat sloupec source_ s názvem zdrojové tabulky. Sloupec lze přejmenovat pomocí parametru withsource .

sloupce výsledků

Zdrojové tabulky, které neobsahují žádný sloupec používaný vyhodnocením predikátu, se vyfiltrují.

Při použití project-smartbudou sloupce, které se zobrazí ve výstupu, následující:

  • Sloupce, které se zobrazují explicitně v predikátu.
  • Sloupce, které jsou společné pro všechny filtrované tabulky.

Zbývající sloupce se zabalí do tašky vlastností a zobrazí se v dalším pack sloupci. Sloupec, na který se odkazuje explicitně predikátem a který se zobrazí ve více tabulkách s více typy, bude mít ve schématu výsledků pro každý takový typ jiný sloupec. Každý z názvů sloupců bude vytvořen z původního názvu sloupce a typu odděleného podtržítkem.

Při použití project ColumnName[: ColumnType , ... ] [, pack_all()]:

  • Výsledná tabulka bude obsahovat sloupce zadané v seznamu. Pokud zdrojová tabulka neobsahuje určitý sloupec, hodnoty v odpovídajících řádcích budou null.
  • Při zadávání ColumnType s ColumnName bude tento sloupec ve výsledku mít daný typ a hodnoty budou v případě potřeby přetypované na tento typ. Přetypování nebude mít vliv na typ sloupce při vyhodnocování predikátu.
  • Při pack_all() použití se všechny sloupce, včetně promítaných sloupců, zabalí do tašky vlastností a ve výchozím nastavení se zobrazí ve sloupci column1. V pytli vlastností slouží název zdrojového sloupce jako název vlastnosti a hodnota sloupce slouží jako hodnota vlastnosti.

Syntaxe predikátu

Operátor hledání podporuje alternativní syntaxi * has termínu a pomocí pouhého termínu vyhledá termín ve všech vstupních sloupcích.

Souhrn některých funkcí filtrování najdete v tématu kde.

Notes

  • project Pokud klauzule odkazuje na sloupec, který se zobrazuje v několika tabulkách a má více typů, musí tento typ v klauzuli projektu použít tento odkaz na sloupec.
  • Pokud se sloupec zobrazí v několika tabulkách a má více typů a project-smart používá se, bude pro každý typ ve výsledku findodpovídající sloupec, jak je popsáno ve sjednocení.
  • Když použijete projektově inteligentní, změny v predikátu, ve zdrojové sadě tabulek nebo ve schématu tabulek můžou vést ke změně ve výstupním schématu. Pokud je potřeba schéma konstantních výsledků, použijte místo toho projekt .
  • find obor nemůže obsahovat funkce. Pokud chcete do oboru hledání zahrnout funkci, definujte příkaz let s klíčovým slovem view.

Tipy týkající se výkonu

  • Na rozdíl od tabulkových výrazů používejte tabulky. Pokud je tabulkový výraz, operátor find se vrátí k union dotazu, který může vést ke snížení výkonu.
  • Pokud je sloupec, který se zobrazuje ve více tabulkách a má více typů, je součástí klauzule projektu, před předáním finddo klauzule projektu přidejte do klauzule projektu columnType.
  • Přidejte do predikátu filtry založené na čase. Použijte hodnotu sloupce datetime nebo ingestion_time().
  • Hledání v konkrétních sloupcích místo fulltextového vyhledávání
  • Není lepší odkazovat na sloupce, které se zobrazují ve více tabulkách a mají více typů. Pokud je predikát platný při překladu tohoto typu sloupců pro více než jeden typ, dotaz se vrátí do sjednocení. Podívejte se například na příklady případů, kdy hledání bude fungovat jako sjednocení.

Příklady

Vyhledávání termínů ve všech tabulkách v aktuální databázi

Dotaz najde všechny řádky ze všech tabulek v aktuální databázi, ve které libovolný sloupec obsahuje slovo Hernandez. Výsledné záznamy se transformují podle výstupního schématu. Výstup obsahuje řádky z Customers tabulky a SalesTable tabulky ContosoSales databáze.

find "Hernandez"

Vyhledávání termínů ve všech tabulkách odpovídajících vzoru názvů v aktuální databázi

Dotaz najde všechny řádky ze všech tabulek v aktuální databázi, jejichž název začíná C, a ve kterém libovolný sloupec obsahuje slovo Hernandez. Výsledné záznamy se transformují podle výstupního schématu. Výstup teď obsahuje jenom záznamy z Customers tabulky.

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

Vyhledávání termínů ve všech tabulkách ve všech databázích v clusteru

Dotaz najde všechny řádky ze všech tabulek ve všech databázích, ve kterých libovolný sloupec obsahuje slovo Kusto. Tento dotaz je dotaz napříč databázemi . Výsledné záznamy se transformují podle výstupního schématu.

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

Vyhledávání termínů ve všech tabulkách a databázích odpovídajících vzoru názvů v clusteru

Dotaz najde všechny řádky ze všech tabulek, jejichž název začíná K ve všech databázích, jejichž název začíná B a ve kterém libovolný sloupec obsahuje slovo Kusto. Výsledné záznamy se transformují podle výstupního schématu.

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

Vyhledávání termínů v několika clusterech

Dotaz najde všechny řádky ze všech tabulek, jejichž název začíná K ve všech databázích, jejichž název začíná B a ve kterém libovolný sloupec obsahuje slovo Kusto. Výsledné záznamy se transformují podle výstupního schématu.

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

Vyhledávání termínů ve všech tabulkách

Dotaz najde všechny řádky ze všech tabulek, ve kterých libovolný sloupec obsahuje slovo Kusto. Výsledné záznamy se transformují podle výstupního schématu.

find "Kusto"

Příklady výsledků výstupu find

Následující příklady ukazují, jak find se dají použít ve dvou tabulkách: EventsTable1 a EventsTable2. Předpokládejme, že máme další obsah těchto dvou tabulek:

EventsTable1

Session_Id Level Text události Verze
acbd207d-51aa-4df7-bfa7-be70eb68f04e Informační Nějaký text 1 v1.0.0
acbd207d-51aa-4df7-bfa7-be70eb68f04e Chyba Nějaký text 2 v1.0.0
28b8e46e-3c31-43cf-83cb-48921c3986fc Chyba Nějaký text 3 v1.0.1
8f057b11-3281-45c3-a856-05ebb18a3c59 Informační Nějaký text 4 v1.1.0

EventsTable2

Session_Id Level Text události EventName
f7d5f95f-f580-4ea6-830b-5776c8d64fdd Informační Jiný text 1 Událost 1
acbd207d-51aa-4df7-bfa7-be70eb68f04e Informační Jiný text 2 Událost 2
acbd207d-51aa-4df7-bfa7-be70eb68f04e Chyba Jiný text 3 Událost 3
15eaeab5-8576-4b58-8fc6-478f75d8fee4 Chyba Jiný text 4 Událost 4

Hledání ve společných sloupcích, běžných a neobvyklých sloupcích projektu a zabalení zbytku

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

Výstup

zdroj_ Text události Verze EventName dav_
EventsTable1 Nějaký text 2 v1.0.0 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"}
EventsTable2 Jiný text 3 Událost 3 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"}

Hledání v běžných a neobvyklých sloupcích

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

Výstup

zdroj_ Session_Id Text události Verze EventName
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Nějaký text 1 v1.0.0
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Nějaký text 2 v1.0.0
EventsTable2 f7d5f95f-f580-4ea6-830b-5776c8d64fdd Jiný text 1 Událost 1

Poznámka: V praxi budou řádky EventsTable1 filtrovány s predikátem Version == 'v1.0.0' a řádky EventsTable2 budou filtrovány s predikátem EventName == 'Event1' .

Použití zkráceného zápisu k vyhledávání ve všech tabulkách v aktuální databázi

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

Výstup

zdroj_ Session_Id Level Text události dav_
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Informační Nějaký text 1 {"Version":"v1.0.0"}
EventsTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Chyba Nějaký text 2 {"Version":"v1.0.0"}
EventsTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Informační Jiný text 2 {"EventName":"Event2"}
EventsTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Chyba Jiný text 3 {"EventName":"Event3"}

Vrátí výsledky z každého řádku jako taška vlastností.

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

Výstup

zdroj_ dav_
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"}

Příklady případů, kdy find bude fungovat jako union

Použití ne tabulkového výrazu jako operandu find

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

Odkazování na sloupec, který se zobrazuje v několika tabulkách a má více typů

Předpokládejme, že jsme vytvořili dvě tabulky spuštěním příkazu:

.create tables 
  Table1 (Level:string, Timestamp:datetime, ProcessId:string),
  Table2 (Level:string, Timestamp:datetime, ProcessId:int64)
  • Následující dotaz se spustí jako union.
find in (Table1, Table2) where ProcessId == 1001

Schéma výsledků výstupu bude (Level:string, Časové razítko, ProcessId_string, ProcessId_int).

  • Následující dotaz se také spustí jako union, ale vytvoří jiné schéma výsledků.
find in (Table1, Table2) where ProcessId == 1001 project Level, Timestamp, ProcessId:string 

Schéma výsledků výstupu bude (Level:string, časové razítko, ProcessId_string)