operator find

Znajduje wiersze pasujące do predykatu w zestawie tabel.

Zakresem find może być również między bazami danych lub między klastrami.

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"

Uwaga

find operator jest znacznie mniej wydajny niż filtrowanie tekstu specyficzne dla kolumny. Za każdym razem, gdy kolumny są znane, zalecamy użycie operatora where. find Nie będzie działać dobrze, gdy obszar roboczy zawiera dużą liczbę tabel i kolumn, a skanowany wolumin danych jest wysoki, a zakres czasu zapytania jest wysoki.

Składnia

  • find[ColumnName] [inwithsource(= Tables)] wherePredykate [project-smartproject | ColumnName[:ColumnType, ... ] [,pack_all()]]

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

Dowiedz się więcej o konwencjach składniowych.

Parametry

Nazwa Typ Wymagane Opis
Columnname string Domyślnie dane wyjściowe będą zawierać kolumnę o nazwie source_ , której wartości wskazują, która tabela źródłowa przyczyniła się do każdego wiersza. W przypadku określenia parametru Nazwakolumny zostanie użyty zamiast source_. Po dopasowaniu symboli wieloznacznych, jeśli zapytanie odwołuje się do tabel z więcej niż jednej bazy danych, w tym domyślna baza danych, wartość tej kolumny będzie mieć nazwę tabeli kwalifikowaną z bazą danych. Podobnie kwalifikacje klastra i bazy danych będą obecne w wartości, jeśli istnieje odwołanie do więcej niż jednego klastra.
Predykat bool ✔️ To wyrażenie logiczne jest obliczane dla każdego wiersza w każdej tabeli wejściowej. Aby uzyskać więcej informacji, zobacz szczegóły składni predykatu.
Tabele string Zero lub więcej odwołań do tabeli rozdzielanych przecinkami. Domyślnie find funkcja będzie wyglądać we wszystkich tabelach w bieżącej bazie danych. Możesz użyć:
1. Nazwa tabeli, na przykład Events
2. Wyrażenie kwerendy, takie jak (Events | where id==42)
3. Zestaw tabel określonych z symbolem wieloznacznymi. Na przykład tworzy połączenie wszystkich tabel w bazie danych, E* których nazwy zaczynają się od E.
project-smart lub project string Jeśli nie zostanie określony, project-smart będzie używany domyślnie. Aby uzyskać więcej informacji, zobacz szczegóły schematu wyjściowego.
  • withsource=Nazwakolumny: opcjonalne. Domyślnie dane wyjściowe będą zawierać kolumnę o nazwie source_ , której wartości wskazują, która tabela źródłowa przyczyniła się do każdego wiersza. W przypadku określenia parametru Nazwakolumny zostanie użyty zamiast source_.

  • Predykat: booleanwyrażenie na kolumnach tabel wejściowych Tabela [,Tabela, ...]. Jest on oceniany dla każdego wiersza w każdej tabeli wejściowej. Aby uzyskać więcej informacji, zobacz szczegóły składni predykatu.

  • Tabele: opcjonalne. Zero lub więcej odwołań do tabeli rozdzielanych przecinkami. Domyślnie funkcja znajdź wyszuka wszystkie tabele:

    • Nazwa tabeli, na przykład Events
    • Wyrażenie zapytania, takie jak (Events | where id==42)
    • Zestaw tabel określony z symbolem wieloznacznymi. Na przykład może stanowić związek wszystkich tabel, E* których nazwy zaczynają się od E.
  • project-smart | project: Jeśli nie zostanie określony project-smart , będzie używany domyślnie. Aby uzyskać więcej informacji, zobacz szczegóły schematu wyjściowego.

Zwraca

Przekształcanie wierszy w tabeli [,Tabela, ...], dla których predykat to true. Wiersze są przekształcane zgodnie ze schematem danych wyjściowych.

Schemat danych wyjściowych

kolumna source_

Dane wyjściowe operatora find zawsze będą zawierać kolumnę source_ z nazwą tabeli źródłowej. Nazwę kolumny można zmienić przy użyciu parametru withsource .

kolumny wyników

Tabele źródłowe, które nie zawierają żadnej kolumny używanej przez ocenę predykatu, zostaną odfiltrowane.

W przypadku użycia polecenia project-smartkolumny, które będą wyświetlane w danych wyjściowych, będą następujące:

  • Kolumny, które są wyświetlane jawnie w predykacie.
  • Kolumny wspólne dla wszystkich filtrowanych tabel.

Pozostałe kolumny zostaną zapakowane w torbę właściwości i pojawią się w dodatkowej pack kolumnie. Kolumna, do którego odwołuje się jawnie predykat i pojawia się w wielu tabelach z wieloma typami, będzie miała inną kolumnę w schemacie wyników dla każdego takiego typu. Każda z nazw kolumn zostanie skonstruowana z oryginalnej nazwy i typu kolumny oddzielonej znakiem podkreślenia.

W przypadku korzystania z kolumny projectColumnName[:ColumnType, ... ] [,pack_all()]:

  • Tabela wyników będzie zawierać kolumny określone na liście. Jeśli tabela źródłowa nie zawiera określonej kolumny, wartości w odpowiednich wierszach będą mieć wartość null.
  • Podczas określania kolumny ColumnType z kolumną ColumnName ta kolumna w "wyniku" będzie miała podany typ, a wartości będą rzutwane do tego typu, jeśli jest to konieczne. Rzutowanie nie będzie miało wpływu na typ kolumny podczas oceniania predykatu.
  • Gdy pack_all() jest używany, wszystkie kolumny, w tym przewidywane kolumny, są pakowane do torby właściwości i pojawiają się w dodatkowej kolumnie, domyślnie "column1". W worku właściwości nazwa kolumny źródłowej służy jako nazwa właściwości, a wartość kolumny służy jako wartość właściwości.

Składnia predykatu

Operator znajdowania obsługuje alternatywną składnię * has terminu, a użycie tylko terminu spowoduje wyszukanie terminu we wszystkich kolumnach wejściowych.

Aby zapoznać się z podsumowaniem niektórych funkcji filtrowania, zobacz , gdzie operator.

Uwagi

  • Jeśli klauzula project odwołuje się do kolumny, która pojawia się w wielu tabelach i ma wiele typów, typ musi być zgodny z tym odwołaniem do kolumny w klauzuli projektu
  • Jeśli kolumna pojawia się w wielu tabelach i ma wiele typów i project-smart jest używana, dla każdego typu w findwynikach będzie znajdować się odpowiednia kolumna, zgodnie z opisem w unii
  • W przypadku korzystania z funkcji project-smart zmiany w predykacie, w zestawie tabel źródłowych lub w schemacie tabel mogą spowodować zmianę schematu wyjściowego. Jeśli wymagany jest stały schemat wyników, użyj projektu zamiast tego
  • find zakres nie może zawierać funkcji. Aby uwzględnić funkcję w zakresie find, zdefiniuj instrukcję let za pomocą słowa kluczowego view.

Porady dotyczące wydajności

  • Używaj tabel w przeciwieństwie do wyrażeń tabelarycznych. Jeśli wyrażenie tabelaryczne, operator find powraca do union zapytania, które może spowodować obniżenie wydajności.
  • Jeśli kolumna wyświetlana w wielu tabelach i ma wiele typów, jest częścią klauzuli projektu, preferuj dodanie kolumny ColumnType do klauzuli projektu w celu zmodyfikowania tabeli przed przekazaniem jej do findelementu .
  • Dodaj filtry oparte na czasie do predykatu. Użyj wartości kolumny data/godzina lub ingestion_time().
  • Wyszukiwanie w określonych kolumnach zamiast wyszukiwania pełnotekstowego.
  • Lepiej nie odwoływać się do kolumn, które pojawiają się w wielu tabelach i mają wiele typów. Jeśli predykat jest prawidłowy podczas rozpoznawania takich kolumn dla więcej niż jednego typu, zapytanie wróci do unii. Zobacz na przykład przykłady przypadków, w których funkcja find będzie działać jako związek.

Przykłady

Wyszukiwanie terminów we wszystkich tabelach w bieżącej bazie danych

Zapytanie znajduje wszystkie wiersze ze wszystkich tabel w bieżącej bazie danych, w której dowolna kolumna zawiera słowo Hernandez. Wynikowe rekordy są przekształcane zgodnie ze schematem danych wyjściowych. Dane wyjściowe zawierają wiersze z Customers tabeli i SalesTable tabeli ContosoSales bazy danych.

find "Hernandez"

Wyszukiwanie terminów we wszystkich tabelach pasujących do wzorca nazwy w bieżącej bazie danych

Zapytanie znajduje wszystkie wiersze ze wszystkich tabel w bieżącej bazie danych, których nazwa zaczyna się od C, i w której każda kolumna zawiera słowo Hernandez. Wynikowe rekordy są przekształcane zgodnie ze schematem danych wyjściowych. Teraz dane wyjściowe zawierają tylko rekordy z Customers tabeli.

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

Wyszukiwanie terminów we wszystkich tabelach we wszystkich bazach danych w klastrze

Zapytanie znajduje wszystkie wiersze ze wszystkich tabel we wszystkich bazach danych, w których każda kolumna zawiera słowo Kusto. To zapytanie jest zapytaniem między bazami danych . Wynikowe rekordy są przekształcane zgodnie ze schematem danych wyjściowych.

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

Wyszukiwanie terminów we wszystkich tabelach i bazach danych pasujących do wzorca nazwy w klastrze

Zapytanie znajduje wszystkie wiersze ze wszystkich tabel, których nazwa zaczyna się od we wszystkich bazach danych, których nazwa zaczyna K się od B i w której każda kolumna zawiera słowo Kusto. Wynikowe rekordy są przekształcane zgodnie ze schematem danych wyjściowych.

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

Wyszukiwanie terminów w kilku klastrach

Zapytanie znajduje wszystkie wiersze ze wszystkich tabel, których nazwa zaczyna się od we wszystkich bazach danych, których nazwa zaczyna K się od B i w której każda kolumna zawiera słowo Kusto. Wynikowe rekordy są przekształcane zgodnie ze schematem danych wyjściowych.

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

Wyszukiwanie terminów we wszystkich tabelach

Zapytanie znajduje wszystkie wiersze ze wszystkich tabel, w których każda kolumna zawiera słowo Kusto. Wynikowe rekordy są przekształcane zgodnie ze schematem danych wyjściowych.

find "Kusto"

Przykłady wyników wyjściowych find

W poniższych przykładach pokazano, jak find można używać w dwóch tabelach: EventsTable1 i EventsTable2. Załóżmy, że mamy następną zawartość tych dwóch tabel:

EventTable1

Session_id Poziom EventText Wersja
acbd207d-51aa-4df7-bfa7-be70eb68f04e Informacje Tekst1 Wersja 1.0.0
acbd207d-51aa-4df7-bfa7-be70eb68f04e Błąd Część tekstu2 Wersja 1.0.0
28b8e46e-3c31-43cf-83cb-48921c3986fc Błąd Tekst3 Wersja 1.0.1
8f057b11-3281-45c3-a856-05ebb18a3c59 Informacje Część tekstu4 Wersja 1.1.0

EventTable2

Session_id Poziom EventText EventName
f7d5f95f-f580-4ea6-830b-5776c8d64fdd Informacje Inny tekst1 Zdarzenie1
acbd207d-51aa-4df7-bfa7-be70eb68f04e Informacje Inny tekst2 Zdarzenie 2
acbd207d-51aa-4df7-bfa7-be70eb68f04e Błąd Inny tekst3 Zdarzenie 3
15eaeab5-8576-4b58-8fc6-478f75d8fee4 Błąd Inny tekst4 Zdarzenie4

Wyszukiwanie w typowych kolumnach, typowych i nietypowych kolumnach projektu oraz pakowanie pozostałych kolumn

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

Dane wyjściowe

Źródła_ EventText Wersja EventName Dodatkiem service pack_
EventTable1 Część tekstu2 Wersja 1.0.0 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"}
EventTable2 Inny tekst3 Zdarzenie 3 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"}

Wyszukiwanie w typowych i nietypowych kolumnach

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

Dane wyjściowe

Źródła_ Session_id EventText Wersja EventName
EventTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Tekst1 Wersja 1.0.0
EventTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Część tekstu2 Wersja 1.0.0
EventTable2 f7d5f95f-f580-4ea6-830b-5776c8d64fdd Inny tekst1 Zdarzenie1

Uwaga: w praktyce wiersze tabeli EventsTable1 będą filtrowane przy użyciu Version == 'v1.0.0' predykatu, a wiersze Tabeli zdarzeń2 będą filtrowane przy użyciu EventName == 'Event1' predykatu.

Użyj skróconej notacji, aby przeszukiwać wszystkie tabele w bieżącej bazie danych

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

Dane wyjściowe

Źródła_ Session_id Poziom EventText Dodatkiem service pack_
EventTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Informacje Część tekstu1 {"Version":"v1.0.0"}
EventTable1 acbd207d-51aa-4df7-bfa7-be70eb68f04e Błąd Część tekstu2 {"Version":"v1.0.0"}
EventTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Informacje Inny tekst2 {"EventName":"Event2"}
EventTable2 acbd207d-51aa-4df7-bfa7-be70eb68f04e Błąd Inny tekst3 {"EventName":"Event3"}

Zwracanie wyników z każdego wiersza jako torby właściwości

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

Dane wyjściowe

Źródła_ Dodatkiem service pack_
EventTable1 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Information", "EventText":"Some Text1", "Version":"v1.0.0"}
EventTable1 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error", "EventText":"Some Text2", "Version":"v1.0.0"}
EventTable2 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Information", "EventText":"Some Other Text2", "EventName":"Event2"}
EventTable2 {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error", "EventText":"Some Other Text3", "EventName":"Event3"}

Przykłady przypadków, w których find będą działać jako union

Używanie wyrażenia innego niż tabelarycznego w celu znalezienia operandu

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

Odwoływanie się do kolumny wyświetlanej w wielu tabelach i ma wiele typów

Załóżmy, że utworzyliśmy dwie tabele, uruchamiając polecenie:

.create tables 
  Table1 (Level:string, Timestamp:datetime, ProcessId:string),
  Table2 (Level:string, Timestamp:datetime, ProcessId:int64)
  • Następujące zapytanie zostanie wykonane jako union.
find in (Table1, Table2) where ProcessId == 1001

Schemat wyniku wyjściowego będzie ( Level:string, Timestamp, ProcessId_string, ProcessId_int).

  • Następujące zapytanie będzie również wykonywane jako union, ale spowoduje wygenerowanie innego schematu wyników.
find in (Table1, Table2) where ProcessId == 1001 project Level, Timestamp, ProcessId:string 

Schemat wyniku wyjściowego to (Level:string, Timestamp, ProcessId_string)