Operátor find

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

Obor může find 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. Kdykoli jsou sloupce známé, doporučujeme použít operátor where. find nebude fungovat správně, pokud pracovní prostor obsahuje velký počet tabulek a sloupců a objem dat, která se kontrolují, je vysoký a časový rozsah dotazu je vysoký.

Syntax

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

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

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

Parametry

Název Typ Vyž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 jednotlivými řádky. Pokud je zadáno, použije se místo source_ColumnName. Pokud po párování zástupných znaků 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ě se v hodnotě budou vyskytovat kvalifikace clusteru a databáze , pokud se odkazuje na více než jeden cluster.
Predikátu bool ✔️ Tento logický výraz se vyhodnocuje 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 hledat 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 by vytvořil sjednocení všech tabulek v databázi, E* jejichž názvy začínají na E.
project-smart nebo project string Pokud není zadán, project-smart použije se ve výchozím nastavení. Další informace najdete v podrobnostech o output-schema.
  • withsource=ColumnName: Volitelné. Ve výchozím nastavení bude výstup obsahovat sloupec s názvem source_ jehož hodnoty označují, do které zdrojové tabulky přispěly jednotlivé řádky. Pokud je zadáno, použije se místo source_ColumnName.

  • Predikát: booleanVý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. Hledání ve výchozím nastavení vyhledá ve všech tabulkách:

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

Návraty

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

Výstupní schéma

source_ sloupec

Výstup operátoru find 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, budou odfiltrovány.

Když použijete project-smart, zobrazí se ve výstupu následující sloupce:

  • 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 sáčku vlastností a zobrazí se v dalším pack sloupci. Sloupec, na který je explicitně odkazován predikátem a který se zobrazuje ve více tabulkách s více typy, bude mít ve výsledném schématu pro každý takový typ jiný sloupec. Každý z názvů sloupců bude vytvořen z původního názvu a typu sloupce odděleného podtržítkem.

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

  • Výsledná tabulka bude obsahovat sloupce zadané v seznamu. Pokud zdrojová tabulka neobsahuje určitý sloupec, budou hodnoty v odpovídajících řádcích null.
  • Při zadávání ColumnType s ColumnName bude mít tento sloupec v "výsledku" 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 sáčku vlastností a zobrazí se v dalším sloupci( ve výchozím nastavení sloupec1). V kontejneru vlastností název zdrojového sloupce slouží jako název vlastnosti a hodnota sloupce slouží jako hodnota vlastnosti.

Syntaxe predikátu

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

Souhrn některých funkcí filtrování najdete v operátoru where.

Poznámky

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

Tipy pro zvýšení výkonu

  • Místo tabulkových výrazů používejte tabulky. Při tabulkovém výrazu se operátor find vrátí k union dotazu, který může způsobit snížení výkonu.
  • Pokud je sloupec, který se zobrazuje ve více tabulkách a má více typů, součástí klauzule projektu, upřednostněte přidání columnType do klauzule projektu před úpravou tabulky před jejím předáním do find.
  • Přidejte do predikátu filtry založené na čase. Použijte hodnotu sloupce datetime nebo ingestion_time().
  • Místo fulltextového vyhledávání hledejte v konkrétních sloupcích.
  • Je lepší neodkazovat na sloupce, které se zobrazují ve více tabulkách a mají více typů. Pokud je predikát platný při řešení takových typů sloupců pro více než jeden typ, dotaz se vrátí do sjednocení. Podívejte se například na příklady případů, kdy bude hledání 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ů napříč všemi tabulkami, které odpovídají 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á Cna 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 pouze 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 mezidatabázový dotaz. 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 na , ve všech databázích, jejichž název začíná B a ve kterých 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 shlukech

Dotaz najde všechny řádky ze všech tabulek, jejichž název začíná K na , ve všech databázích, jejichž název začíná B a ve kterých 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ýstupních find výsledků

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

Tabulka událostí1

Session_id Level Text události Verze
acbd207d-51aa-4df7-bfa7-be70eb68f04e Informace Nějaký text 1 verze 1.0.0
acbd207d-51aa-4df7-bfa7-be70eb68f04e Chyba Část textu 2 verze 1.0.0
28b8e46e-3c31-43cf-83cb-48921c3986fc Chyba Nějaký text 3 verze 1.0.1
8f057b11-3281-45c3-a856-05ebb18a3c59 Informace Část textu 4 verze 1.1.0

Tabulka událostí 2

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

Hledání ve společných sloupcích, promítání běžných a neobvyklých sloupců a balení 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 Pack_
Tabulka událostí1 Část textu 2 verze 1.0.0 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"}
Tabulka událostí 2 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
Tabulka událostí1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Nějaký text 1 verze 1.0.0
Tabulka událostí1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Část textu 2 verze 1.0.0
Tabulka událostí 2 f7d5f95f-f580-4ea6-830b-5776c8d64fdd Jiný text 1 Událost 1

Poznámka: V praxi se řádky EventsTable1 filtrují pomocí Version == 'v1.0.0' predikátu a řádky EventsTable2 se filtrují pomocí EventName == 'Event1' predikátu.

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 Pack_
Tabulka Událostí1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Informace Část textu 1 {"Version":"v1.0.0"}
Tabulka Událostí1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Chyba Část textu 2 {"Version":"v1.0.0"}
Tabulka Událostí2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Informace Jiný text 2 {"Název_události":"Událost2"}
Tabulka Událostí2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Chyba Jiný text 3 {"EventName":"Event3"}

Vrácení výsledků z každého řádku jako kontejneru vlastností

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

Výstup

Zdroj_ Pack_
Tabulka Událostí1 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Information", "EventText":"Some Text1", "Version":"v1.0.0"}
Tabulka Událostí1 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error", "EventText":"Some Text2", "Version":"v1.0.0"}
Tabulka Událostí2 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Information", "EventText":"Some Other Text2", "EventName":"Event2"}
Tabulka Událostí2 {"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í jiného 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 ve více 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

Výstupní schéma výsledku bude (Level:string, Timestamp, ProcessId_string, ProcessId_int).

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

Výstupní schéma výsledku bude (Level:string, Timestamp, ProcessId_string).