尋找運算子
尋找一組資料表中符合述詞的資料列。
find
的範圍也可以是跨資料庫或跨叢集。
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"
注意
find
運算符比數據行特定的文字篩選更有效率。 每當已知數據行時,我們建議使用 where 運算符。 find
當工作區包含大量的數據表和數據行,且正在掃描的數據量很高且查詢的時間範圍很高時,將無法正常運作。
Syntax
find
[ColumnName] [in
(
Tables)
]where
述詞 [project-smart
|withsource
project
= ColumnName[:
ColumnType,
... ][,
pack_all()
]]find
述詞 [project-smart
|project
ColumnName[:
ColumnType,
... ][,
pack_all()
]]
深入瞭解 語法慣例。
參數
名稱 | 類型 | 必要 | Description |
---|---|---|---|
ColumnName | string |
輸出預設將會包括稱為 source_ 的資料行,其值會指出貢獻每個資料列的來源資料表。 如果指定,將會使用 ColumnName,而不是 source_。 在通配符比對之後,如果查詢參考來自多個資料庫的數據表,包括預設資料庫,則此數據行的值將會具有資料庫限定的數據表名稱。 同樣地,如果參考多個叢集,則值中會出現 cluster 和 database 資格。 | |
Predicate | bool |
✔️ | 這個布爾表達式會針對每個輸入數據表中的每個數據列進行評估。 如需詳細資訊,請參閱述詞語法詳細資料。 |
資料表 | string |
零個或多個逗號分隔數據表參考。 根據預設, find 將會查看目前資料庫中的所有數據表。 您可以使用:1.數據表的名稱,例如 Events 2.查詢表達式,例如 (Events | where id==42) 3.使用通配符指定的一組數據表。 例如, E* 會形成資料庫中所有資料表的聯集,而其名稱的開頭為 E 。 |
|
project-smart 或 project |
string |
如果未指定, project-smart 預設會使用 。 如需詳細資訊,請參閱輸出結構描述詳細資料。 |
withsource=
ColumnName:選用。 輸出預設將會包括稱為 source_ 的資料行,其值會指出貢獻每個資料列的來源資料表。 如果指定,將會使用 ColumnName,而不是 source_。Predicate:輸入資料表 Table [
,
Table, ...] 資料行上的boolean
運算式。其會針對每個輸入資料表中的每個資料列進行評估。 如需詳細資訊,請參閱述詞語法詳細資料。數據表:選擇性。 零個或多個逗號分隔數據表參考。 find 預設會搜尋所有資料表,以取得:
- 資料表名稱,例如
Events
- 查詢運算式,例如
(Events | where id==42)
- 使用萬用字元指定的一組資料表。 例如,
E*
會形成所有資料表的聯集,而其名稱的開頭為E
。
- 資料表名稱,例如
project-smart
|project
:如果未指定,則預設會使用project-smart
。 如需詳細資訊,請參閱輸出結構描述詳細資料。
傳回
轉換 Table [,
Table, ...] 中的資料列,而其 Predicate 是 true
。 資料列會根據輸出結構描述進行轉換。
輸出結構描述
source_ column
Find 運算子輸出一律會包括具有來源資料表名稱的 source_ 資料行。 您可以使用 withsource
參數來重新命名資料行。
結果資料行
如果來源資料表未包含述詞評估所使用的任何資料行,則會將其篩選掉。
當您使用 project-smart
時,將會出現在輸出中的數據行會是:
- 明確出現在述詞中的資料行。
- 所有已篩選資料表通用的資料行。
其餘的資料行會封裝成屬性包,並出現在其他 pack
資料行中。
如果資料行由述詞明確參考且出現在多個具有多個類型的資料表中,則在結果結構描述中,每種這類類型都會有不同的資料行。 每個資料行名稱都是從原始資料行名稱和類型 (以底線分隔) 所構成。
使用 project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]:
- 結果資料表將會包括清單中所指定的資料行。 如果來源資料表未包含特定資料行,則所對應資料列中的值將會是 Null。
- 指定具有 ColumnName 的 ColumnType 時,「結果」中的這個資料行將會具有指定的類型,而且會在需要時將值強制型轉成該類型。 評估 Predicate 時,強制型轉不會影響資料行類型。
- 使用 時
pack_all()
,所有數據行包括投影的數據行都會封裝成屬性包,並預設會出現在其他數據行 'column1'。 在屬性包中,源數據行名稱會做為屬性名稱,而數據行的值則做為屬性值。
述詞語法
find 運算子支援 * has
字詞的替代語法,並且只使用「字詞」將會跨所有輸入資料行來搜尋字詞。
如需一些篩選函數的摘要,請參閱 where 運算子。
備註
- 如果
project
子句參考出現在多個資料表中且具有多種類型的資料行,則類型在 project 子句中的這個資料行參考後面 - 如果資料行出現在多個資料表中、具有多種類型,並且正在使用
project-smart
,則find
結果中的每種類型都會有對應的資料行,如 union 中所述 - 當您使用 專案智慧型手機時,述詞、源數據表集或數據表架構中的變更可能會導致輸出架構變更。 如果需要常數結果結構描述,則請改用 project
find
範圍不能包括函數。 若要在尋找範圍中包括函數,請使用 view 關鍵字定義 let 陳述式。
效能秘訣
- 使用資料表,而不是表格式運算式。
如果是表格式運算式,則 find 運算子會回復為
union
查詢,而此查詢可能會導致效能降低。 - 如果出現在多個資料表中且具有多種類型的資料行是 project 子句的一部分,則偏好先將 ColumnType 新增至 project 子句以修改資料表,再將其傳遞至
find
。 - 將時間型篩選新增至述詞。 使用日期時間資料行值或 ingestion_time()。
- 搜尋特定資料行,而不是全文檢索搜尋。
- 最好不要參考出現在多個資料表中且具有多種類型的資料行。 如果述詞在解析多種類型的這類資料行類型時有效,則查詢將會回復為 union。 例如,請參閱 find 將作為聯集的案例範例。
範例
跨目前資料庫中所有資料表進行字詞查閱
查詢會從目前資料庫的所有資料表中,尋找任何資料行包括 Hernandez
字組的所有資料列。 系統會根據輸出結構描述來轉換產生的記錄。 輸出包含數據表中的數據列 Customers
和 SalesTable
資料庫的數據表 ContosoSales
。
find "Hernandez"
跨目前資料庫中所有符合名稱模式的資料表進行字詞查閱
查詢會從目前資料庫 (名稱開頭為 C
) 的所有資料表中,尋找任何資料行包括 Hernandez
字組的所有資料列。 系統會根據輸出結構描述來轉換產生的記錄。 現在,輸出只會包含數據表中的 Customers
記錄。
find in (C*) where * has "Hernandez"
跨叢集中所有資料庫的所有資料表進行字詞查閱
查詢會從所有資料庫的所有資料表中,尋找任何資料行包括 Kusto
字組的所有資料列。
此查詢是跨資料庫查詢。
系統會根據輸出結構描述來轉換產生的記錄。
find in (database('*').*) where * has "Kusto"
跨叢集中所有符合名稱模式的資料表和資料庫進行字詞查閱
查詢會從所有資料庫 (名稱開頭為 B
) 的所有資料表 (名稱開頭為 K
) 中,尋找任何資料行包括 Kusto
字組的所有資料列。
系統會根據輸出結構描述來轉換產生的記錄。
find in (database("S*").C*) where * has "Kusto"
數個群集中的字詞查閱
查詢會從所有資料庫 (名稱開頭為 B
) 的所有資料表 (名稱開頭為 K
) 中,尋找任何資料行包括 Kusto
字組的所有資料列。
系統會根據輸出結構描述來轉換產生的記錄。
find in (cluster("cluster1").database("B*").K*, cluster("cluster2").database("C*".*))
where * has "Kusto"
find
輸出結果的範例
下列範例顯示如何在兩個資料表上使用 find
:EventsTable1 和 EventsTable2。
假設我們有這兩個資料表的下一個內容:
EventsTable1
Session_Id | 層級 | EventText | 版本 |
---|---|---|---|
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 資訊 | 部分 Text1 | v1.0.0 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 部分 Text2 | v1.0.0 |
28b8e46e-3c31-43cf-83cb-48921c3986fc | 錯誤 | 部分 Text3 | v1.0.1 |
8f057b11-3281-45c3-a856-05ebb18a3c59 | 資訊 | 部分 Text4 | v1.1.0 |
EventsTable2
Session_Id | 層級 | EventText | EventName |
---|---|---|---|
f7d5f95f-f580-4ea6-830b-5776c8d64fdd | 資訊 | 部分其他 Text1 | Event1 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 資訊 | 部分其他 Text2 | Event2 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 部分其他 Text3 | Event3 |
15eaeab5-8576-4b58-8fc6-478f75d8fee4 | 錯誤 | 部分其他 Text4 | Event4 |
在通用資料行中搜尋、投射通用和非通用資料行,並將其餘資料行封裝
find in (EventsTable1, EventsTable2)
where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' and Level == 'Error'
project EventText, Version, EventName, pack_all()
輸出
source_ | EventText | 版本 | EventName | pack_ |
---|---|---|---|---|
EventsTable1 | 部分 Text2 | v1.0.0 | {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"} | |
EventsTable2 | 部分其他 Text3 | Event3 | {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"} |
在通用和非通用資料行中搜尋
find Version == 'v1.0.0' or EventName == 'Event1' project Session_Id, EventText, Version, EventName
輸出
source_ | Session_Id | EventText | 版本 | EventName |
---|---|---|---|---|
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 部分 Text1 | v1.0.0 | |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 部分 Text2 | v1.0.0 | |
EventsTable2 | f7d5f95f-f580-4ea6-830b-5776c8d64fdd | 部分其他 Text1 | Event1 |
注意:實務上,EventsTable1 資料列將會使用 Version == 'v1.0.0'
述詞進行篩選,而 EventsTable2 資料列將會使用 EventName == 'Event1'
述詞進行篩選。
使用縮寫標記法,跨目前資料庫中的所有資料表進行搜尋
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
輸出
source_ | Session_Id | 層級 | EventText | pack_ |
---|---|---|---|---|
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 資訊 | 部分 Text1 | {"Version":"v1.0.0"} |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 部分 Text2 | {"Version":"v1.0.0"} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 資訊 | 部分其他 Text2 | {"EventName":"Event2"} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 部分其他 Text3 | {"EventName":"Event3"} |
傳回每個資料列的結果作為屬性包
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' project pack_all()
輸出
source_ | 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"} |
find
將作為 union
的案例範例
使用非表格式運算式作為 find 運算元
let PartialEventsTable1 = view() { EventsTable1 | where Level == 'Error' };
find in (PartialEventsTable1, EventsTable2)
where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
參考出現在多個資料表中且具有多種類型的資料行
假設我們已執行下列項目來建立兩個資料表:
.create tables
Table1 (Level:string, Timestamp:datetime, ProcessId:string),
Table2 (Level:string, Timestamp:datetime, ProcessId:int64)
- 下列查詢將會執行為
union
。
find in (Table1, Table2) where ProcessId == 1001
輸出結果結構描述將會是 (Level:string, Timestamp, ProcessId_string, ProcessId_int)。
- 下列查詢也會執行為
union
,但會產生不同的結果結構描述。
find in (Table1, Table2) where ProcessId == 1001 project Level, Timestamp, ProcessId:string
輸出結果結構描述將會是 (Level:string, Timestamp, ProcessId_string)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應