尋找運算子
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
尋找符合一組數據表之述詞的數據列。
的範圍 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
當工作區包含大量數據表和數據行,且正在掃描的數據量很高,且查詢的時間範圍很高時,將無法正常運作。
語法
find
[withsource
= ColumnName] [in
(
Tables)
]where
Predicate [project-smart
|project
ColumnName[:
ColumnType,
... ][,
pack_all()
]]find
述詞 [ ColumnName[:
|project-smart
project
ColumnType,
... ] [,
pack_all()
]]
深入瞭解 語法慣例。
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
ColumnName | string |
根據預設,輸出會包含名為 source_ 的數據行,其值會指出哪些源數據表貢獻了每個數據列。 如果指定, 則會使用 ColumnName , 而不是source_。 在通配符比對之後,如果查詢參考來自多個資料庫的數據表,包括預設資料庫,則此數據行的值將會具有與資料庫限定的數據表名稱。 同樣地, 如果參考多個叢集,叢集 和 資料庫 限定性就會出現在 值中。 | |
謂語 | bool |
✔️ | 此布爾表達式會針對每個輸入數據表中的每個數據列進行評估。 如需詳細資訊,請參閱 述詞語法詳細數據。 |
表格 | string |
零個或多個逗號分隔數據表參考。 根據預設, find 將會查看目前資料庫中的所有數據表。 您可以使用:1.數據表的名稱,例如 Events 2. 查詢表示式,例如 (Events | where id==42) 3.使用通配符指定的一組數據表。 例如, E* 會形成資料庫中所有名稱開頭 E 為 之數據表的聯集。 |
|
project-smart 或 project |
string |
如果未指定, project-smart 預設會使用 。 如需詳細資訊,請參閱 輸出架構詳細數據。 |
withsource=
ColumnName:選擇性。 根據預設,輸出會包含名為 source_ 的數據行,其值會指出哪個源數據表貢獻每個數據列。 如果指定, 則會使用 ColumnName , 而不是source_。述詞:
boolean
輸入數據表 [,
Table, ...] 資料行的表達式。它會針對每個輸入數據表中的每個數據列進行評估。 如需詳細資訊,請參閱 述詞語法詳細數據。數據表:選擇性。 零個或多個逗號分隔數據表參考。 根據預設 ,尋找 會搜尋所有資料表:
- 數據表的名稱,例如
Events
- 查詢表達式,例如
(Events | where id==42)
- 以通配符指定的一組數據表。 例如,
E*
會形成名稱開頭E
為 的所有數據表聯集。
- 數據表的名稱,例如
project-smart
|project
:如果未指定project-smart
,預設會使用 。 如需詳細資訊,請參閱 輸出架構詳細數據。
傳回
Table [,
Table, ...] 中的數據列轉換,其中述詞為 true
。 數據列會根據 輸出架構進行轉換。
輸出結構描述
source_數據行
尋找運算子輸出一律會包含 源數據表名稱source_ 數據行。 您可以使用 參數來重新 withsource
命名資料行。
results 數據行
不會包含述詞評估使用之任何數據行的源數據表,將會篩選掉。
當您使用 project-smart
時,輸出中顯示的數據行將會是:
- 明確出現在述詞中的數據行。
- 所有篩選數據表通用的數據行。
其餘的數據行會封裝到屬性包中,並會出現在額外的 pack
數據行中。
述詞明確參考的數據行,並出現在具有多個型別的多個數據表中,每個這類類型的結果架構中都會有不同的數據行。 每個數據行名稱都會從原始數據行名稱和類型建構,並以底線分隔。
使用 project
ColumnName[ :
ColumnType ,
... ] [,
pack_all()
]:
- 結果數據表會包含清單中指定的數據行。 如果源數據表未包含特定數據行,對應數據列中的值會是 Null。
- 使用 ColumnName 指定 ColumnType 時,“result” 中的這個數據行會有指定的類型,而且值會視需要轉換成該類型。 評估述詞時,轉換不會對數據行類型造成影響。
- 使用 時
pack_all()
,所有數據行,包括投影的數據行,都會封裝到屬性包中,並預設會顯示在其他數據行 'column1'。 在屬性包中,源數據行名稱會做為屬性名稱,而數據行的值則做為屬性值。
述詞語法
find 運算符支援字詞的* has
替代語法,而只使用字詞,將會搜尋所有輸入數據行的字詞。
如需某些篩選函式的摘要,請參閱 where 運算符。
備註
project
如果 子句參考出現在多個數據表中的數據行,而且有多個類型,則類型必須遵循專案子句中的這個數據行參考- 如果數據行出現在多個數據表中,且有多個類型且
project-smart
正在使用中,則結果中的每個find
類型都會有對應的數據行,如等位中所述 - 當您使用 專案智慧型手機時,述詞、源數據表集或數據表架構中的變更可能會導致輸出架構變更。 如果需要常數結果架構,請改用專案
find
scope 不能包含 函式。 若要在尋找範圍中包含函式,請使用 view 關鍵詞定義 let 語句。
效能祕訣
- 使用 數據表 , 而不是表格式表達式。
如果表格式表達式,find 運算子會回復為
union
可能導致效能降低的查詢。 - 如果出現在多個資料表且具有多個類型的數據行是專案子句的一部分,則偏好將 ColumnType 加入至專案子句,而不是先修改資料表,再將它傳遞至
find
。 - 將以時間為基礎的篩選新增至述詞。 使用 datetime 資料行值或 ingestion_time()。
- 在特定數據行中搜尋,而不是全文搜索。
- 最好不要參考出現在多個數據表且有多個類型的數據行。 如果在解析多個類型的這類數據行類型時,述詞有效,查詢會回復為等位。 例如,請參閱 尋找將做為等位的案例範例。
範例
目前資料庫中所有數據表的詞彙查閱
查詢會從目前資料庫中的所有數據表中尋找所有數據列,其中任何數據行都包含 這個字 Hernandez
。 產生的記錄會根據 輸出架構進行轉換。 輸出包含數據表 Customers
的數據列和 SalesTable
資料庫的數據表 ContosoSales
。
find "Hernandez"
目前資料庫中所有符合名稱模式之數據表的詞彙查閱
此查詢會從名稱開頭 C
為 的目前資料庫中所有數據表中尋找所有數據列,而其中任何數據行都包含 這個字 Hernandez
。 產生的記錄會根據 輸出架構進行轉換。 現在,輸出只會包含數據表中的 Customers
記錄。
find in (C*) where * has "Hernandez"
叢集中所有資料庫中所有數據表的詞彙查閱
查詢會從所有資料庫中的所有數據表中尋找所有數據列,其中任何數據行都包含 這個字 Kusto
。
此查詢是 跨資料庫 查詢。
產生的記錄會根據 輸出架構進行轉換。
find in (database('*').*) where * has "Kusto"
在叢集中符合名稱模式的所有數據表和資料庫間詞彙查閱
此查詢會從名稱開頭 K
的所有資料庫中,尋找所有數據表的所有數據列,其名稱開頭 B
為 ,且其中任何數據行都包含這個字 Kusto
。
產生的記錄會根據 輸出架構進行轉換。
find in (database("S*").C*) where * has "Kusto"
數個叢集中的詞彙查閱
此查詢會從名稱開頭 K
的所有資料庫中,尋找所有數據表的所有數據列,其名稱開頭 B
為 ,且其中任何數據行都包含這個字 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 | 資訊 | 部分文字1 | v1.0.0 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 部分文字2 | v1.0.0 |
28b8e46e-3c31-43cf-83cb-48921c3986fc | 錯誤 | 部分文字3 | v1.0.1 |
8f057b11-3281-45c3-a856-05ebb18a3c59 | 資訊 | 部分文字4 | v1.1.0 |
EventsTable2
Session_Id | 層級 | EventText | EventName |
---|---|---|---|
f7d5f95f-f580-4ea6-830b-5776c8d64fdd | 資訊 | 其他文字1 | Event1 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 資訊 | 其他文字2 | Event2 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 其他文字3 | Event3 |
15eaeab5-8576-4b58-8fc6-478f75d8fee4 | 錯誤 | 其他文字4 | Event4 |
搜尋一般數據行、專案一般和不常見數據行,並包裝其餘數據行
find in (EventsTable1, EventsTable2)
where Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' and Level == 'Error'
project EventText, Version, EventName, pack_all()
輸出
源_ | EventText | 版本 | EventName | 包_ |
---|---|---|---|---|
EventsTable1 | 部分文字2 | v1.0.0 | {“Session_Id”:“acbd207d-51aa-4df7-bfa7-be70eb68f04e”, “Level”:“Error”} | |
EventsTable2 | 其他文字3 | Event3 | {“Session_Id”:“acbd207d-51aa-4df7-bfa7-be70eb68f04e”, “Level”:“Error”} |
在一般和不常見數據行中搜尋
find Version == 'v1.0.0' or EventName == 'Event1' project Session_Id, EventText, Version, EventName
輸出
源_ | Session_Id | EventText | 版本 | EventName |
---|---|---|---|---|
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 部分文字1 | v1.0.0 | |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 部分文字2 | v1.0.0 | |
EventsTable2 | f7d5f95f-f580-4ea6-830b-5776c8d64fdd | 其他文字1 | Event1 |
注意:實際上, EventsTable1 數據列會使用 Version == 'v1.0.0'
述詞進行篩選,而 EventsTable2 數據列將會使用 EventName == 'Event1'
述詞進行篩選。
使用縮寫表示法來搜尋目前資料庫中的所有數據表
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
輸出
源_ | Session_Id | 層級 | EventText | 包_ |
---|---|---|---|---|
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 資訊 | 部分文字1 | {“Version”:“v1.0.0”} |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 部分文字2 | {“Version”:“v1.0.0”} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 資訊 | 其他文字2 | {“EventName”:“Event2”} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 錯誤 | 其他文字3 | {“EventName”:“Event3”} |
以屬性包的形式傳回每個數據列的結果
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e' project pack_all()
輸出
源_ | 包_ |
---|---|
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
使用非表格式表示式作為尋找操作數
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)