operator find
Dotyczy: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Znajduje wiersze pasujące do predykatu w zestawie tabel.
Zakres obiektu 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] [in
=(
withsource
Tables)
]where
Predykate [project-smart
|project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]]find
Predykat [project-smart
|project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]]
Dowiedz się więcej na temat konwencji składni.
Parametry
Nazwisko | Type | Wymagania | opis |
---|---|---|---|
Nazwakolumny | 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. Jeśli zostanie określony, kolumna ColumnName będzie używana zamiast source_. Po dopasowaniu symboli wieloznacznych, jeśli zapytanie odwołuje się do tabel z więcej niż jednej bazy danych, łącznie z domyślną bazą danych, wartość tej kolumny będzie miała kwalifikowaną nazwę tabeli z bazą danych. Podobnie kwalifikacje klastra i bazy danych będą obecne w wartości, jeśli odwołano się 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 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 zapytania, takie jak (Events | where id==42) 3. Zestaw tabel określonych z symbolem wieloznacznymi. Na przykład E* może utworzyć związek wszystkich tabel w bazie danych, 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: opcjonalnie. 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. Jeśli zostanie określony, kolumna ColumnName będzie używana zamiast source_.Predykat:
boolean
wyrażenie dla kolumn tabel wejściowych [ 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ź będzie wyszukiwać wszystkie tabele dla:
- Nazwa tabeli, na przykład
Events
- Wyrażenie zapytania, takie jak
(Events | where id==42)
- Zestaw tabel określonych z symbolami wieloznacznymi. Na przykład może utworzyć związek wszystkich tabel,
E*
których nazwy zaczynają się odE
.
- Nazwa tabeli, na przykład
project-smart
|project
: Jeśli nie zostanie określonyproject-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 znajdowania 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-smart
kolumny, 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 ColumnName[:
ColumnType ,
... ] [ pack_all()
,
]:project
- 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ą rzutować do tego typu w razie potrzeby. 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 torbie 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 wyszukiwania 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 postępować zgodnie z tym odwołaniem do kolumny w klauzuli projektu - Jeśli kolumna jest wyświetlana w wielu tabelach i ma wiele typów i
project-smart
jest używana, dla każdego typu w wyniku będzie widoczna odpowiednia kolumna, zgodnie z opisem wfind
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 wyszukiwania, zdefiniuj instrukcję let za pomocą słowa kluczowego view.
Wskazówki 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 typu ColumnType do klauzuli projektu w celu zmodyfikowania tabeli przed przekazaniem jej do
find
elementu . - Dodaj filtry oparte na czasie do predykatu. Użyj wartości kolumny data/godzina lub ingestion_time().
- Wyszukaj w określonych kolumnach, a nie w wyszukiwaniu pełnotekstowym.
- 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 takiego typu kolumn dla więcej niż jednego typu, zapytanie powróci do unii. Zobacz na przykład przykłady przypadków, w których funkcja find będzie działać jako unia.
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 każda 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 się K
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 się K
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 wyraz 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 | Informacja | Tekst1 | v1.0.0 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Błąd | Część tekstu2 | v1.0.0 |
28b8e46e-3c31-43cf-83cb-48921c3986fc | Błąd | Tekst3 | Wersja 1.0.1 |
8f057b11-3281-45c3-a856-05ebb18a3c59 | Informacja | Tekst4 | wersja 1.1.0 |
EventTable2
Session_Id | Poziom | EventText | EventName |
---|---|---|---|
f7d5f95f-f580-4ea6-830b-5776c8d64fdd | Informacja | Inny tekst1 | Zdarzenie1 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Informacja | 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 |
Wyszukaj typowe kolumny, projektuj typowe i nietypowe kolumny i pakuj resztę
find in (EventsTable1, EventsTable2)
where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' and Level == 'Error'
project EventText, Version, EventName, pack_all()
Wyjście
źródło_ | EventText | Wersja | EventName | paczka_ |
---|---|---|---|---|
EventTable1 | Część tekstu2 | v1.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
Wyjście
źródło_ | Session_Id | EventText | Wersja | EventName |
---|---|---|---|---|
EventTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Tekst1 | v1.0.0 | |
EventTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Część tekstu2 | v1.0.0 | |
EventTable2 | f7d5f95f-f580-4ea6-830b-5776c8d64fdd | Inny tekst1 | Zdarzenie1 |
Uwaga: w praktyce wiersze EventsTable1 będą filtrowane za pomocą Version == 'v1.0.0'
predykatu, a wiersze Tabeli zdarzeń2 będą filtrowane za pomocą EventName == 'Event1'
predykatu.
Użyj notacji skróconej do wyszukiwania we wszystkich tabelach w bieżącej bazie danych
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
Wyjście
źródło_ | Session_Id | Poziom | EventText | paczka_ |
---|---|---|---|---|
EventTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Informacja | Tekst1 | {"Version":"v1.0.0"} |
EventTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Błąd | Część tekstu2 | {"Version":"v1.0.0"} |
EventTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Informacja | 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()
Wyjście
źródło_ | paczka_ |
---|---|
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 postaci znajdowania 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, która jest wyświetlana 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 to (Level:string, Timestamp, ProcessId_string, ProcessId_int).
- Następujące zapytanie zostanie również wykonane 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 będzie mieć wartość (Level:string, Timestamp, ProcessId_string)