共用方式為


尋找運算子

尋找一組資料表中符合述詞的資料列。

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 | withsourceproject= ColumnName[:ColumnType, ... ][,pack_all()]]

  • find述詞 [project-smart | projectColumnName[:ColumnType , ... ][,pack_all()]]

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
ColumnName string 輸出預設將會包括稱為 source_ 的資料行,其值會指出貢獻每個資料列的來源資料表。 如果指定,將會使用 ColumnName,而不是 source_。 在通配符比對之後,如果查詢參考來自多個資料庫的數據表,包括預設資料庫,則此數據行的值將會具有資料庫限定的數據表名稱。 同樣地,如果參考多個叢集,則值中會出現 clusterdatabase 資格。
Predicate bool ✔️ 這個布爾表達式會針對每個輸入數據表中的每個數據列進行評估。 如需詳細資訊,請參閱述詞語法詳細資料
資料表 string 零個或多個逗號分隔數據表參考。 根據預設, find 將會查看目前資料庫中的所有數據表。 您可以使用:
1.數據表的名稱,例如 Events
2.查詢表達式,例如 (Events | where id==42)
3.使用通配符指定的一組數據表。 例如,E* 會形成資料庫中所有資料表的聯集,而其名稱的開頭為 E
project-smartproject 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, ...] 中的資料列,而其 Predicatetrue。 資料列會根據輸出結構描述進行轉換。

輸出結構描述

source_ column

Find 運算子輸出一律會包括具有來源資料表名稱的 source_ 資料行。 您可以使用 withsource 參數來重新命名資料行。

結果資料行

如果來源資料表未包含述詞評估所使用的任何資料行,則會將其篩選掉。

當您使用 project-smart時,將會出現在輸出中的數據行會是:

  • 明確出現在述詞中的資料行。
  • 所有已篩選資料表通用的資料行。

其餘的資料行會封裝成屬性包,並出現在其他 pack 資料行中。 如果資料行由述詞明確參考且出現在多個具有多個類型的資料表中,則在結果結構描述中,每種這類類型都會有不同的資料行。 每個資料行名稱都是從原始資料行名稱和類型 (以底線分隔) 所構成。

使用 projectColumnName[:ColumnType, ... ] [,pack_all()]:

  • 結果資料表將會包括清單中所指定的資料行。 如果來源資料表未包含特定資料行,則所對應資料列中的值將會是 Null。
  • 指定具有 ColumnNameColumnType 時,「結果」中的這個資料行將會具有指定的類型,而且會在需要時將值強制型轉成該類型。 評估 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 字組的所有資料列。 系統會根據輸出結構描述來轉換產生的記錄。 輸出包含數據表中的數據列 CustomersSalesTable 資料庫的數據表 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"

跨所有資料表進行字詞查閱

查詢會從所有資料表中,尋找任何資料行包括 Kusto 字組的所有資料列。 系統會根據輸出結構描述來轉換產生的記錄。

find "Kusto"

find 輸出結果的範例

下列範例顯示如何在兩個資料表上使用 findEventsTable1EventsTable2。 假設我們有這兩個資料表的下一個內容:

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)