find 运算符
在一组表中查找与谓词匹配的行。
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
(
表)
]where
谓词 [project-smart
|project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]]find
谓词 [project-smart
|project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]]
详细了解语法约定。
参数
客户 | 类型 | 必需 | 描述 |
---|---|---|---|
ColumnName | string |
默认情况下,输出将包括一个名为 source_ 的列,其值指示哪个源表提供了每一行。 如果指定,将使用 ColumnName,而不是 source_ 。 通配符匹配后,如果查询引用了多个数据库(包括默认数据库)中的表,则此列的值将具有使用数据库进行限定的表名。 同样,如果引用了多个群集,则值中将存在“群集”和“数据库”限定条件 。 | |
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_ 。谓词:针对输入表 Table [
,
Table...] 的boolean
表达式。对每个输入表中的每一行执行计算。 有关详细信息,请参阅谓词语法详细信息。Tables:可选。 零个或零个以上的逗号分隔的表格引用。 默认情况下 find 将在所有表中搜索:
- 表的名称,如
Events
- 查询表达式,如
(Events | where id==42)
- 使用通配符指定的一组表。 例如,
E*
将构成所有名称以E
开头的表的并集。
- 表的名称,如
project-smart
|project
:如果未指定,则默认情况下将使用project-smart
。 有关详细信息,请参阅输出架构详细信息。
返回
Predicate 为 true
的 Table [,
Table, ...] 中的行的转换。 行根据输出架构进行转换。
输出架构
source_ 列
find 运算符输出始终包含具有源表名称的 source_ 列。 可以使用 withsource
参数重命名该列。
结果列
将筛除不包含谓词评估所用的任何列的源表。
使用 project-smart
时,输出中会显示的列为:
- 在谓词中显式显示的列。
- 所有筛选的表的公共列。
其余列将打包为属性包,并显示在其他 pack
列中。
谓词显式引用并显示在具有多种类型(每种类型在结果架构中将具有不同的列)的多个表中的列。 每个列名都基于原始列名和类型构造而成,并用下划线分隔。
使用 project
ColumnName[:
ColumnType ,
... ] [,
pack_all()
] 时:
- 结果表将包含列表中指定的列。 如果源表不包含特定列,则相应行中的值将为 NULL。
- 使用 ColumnName 指定 ColumnType 时,“结果”中的此列将具有给定的类型,并且值将根据需要强制转换为该类型 。 评估 Predicate 时,强制转换不会影响列类型。
- 使用
pack_all()
时,所有列(包括投影列)都打包到一个属性包中,并显示在一个附加列中,默认为“column1”。 在该属性包中,源列名称用作属性名称,列的值用作属性值。
谓词语法
find 运算符支持 * has
术语的替代语法,并且仅使用 term 即可在所有输入列中搜索术语 。
有关某些筛选函数的摘要,请参阅 where 运算符。
说明
- 如果
project
子句引用了出现在多个表中且具有多种类型的列,则在 project 子句中,类型必须遵循此列引用 - 如果某列出现在多个表中且具有多种类型,并且正在使用
project-smart
,则find
的结果中每种类型都会有一个对应的列,如 union 中所述 - 当使用 project-smart 时,谓词、源表集或表架构中的更改可能会导致输出架构发生更改。 如果需要常量结果架构,请改用 project
find
作用域不能包括函数。 要在 find 作用域中包含函数,请使用 view 关键字定义 let 语句。
性能提示
- 使用表,而不是表格表达式。
如果使用表格表达式,则 find 运算符将回退到
union
查询,这可能会导致性能下降。 - 如果列出现在多个表中并具有多种类型,并且是 project 子句的一部分,则在将表传递给
find
之前,最好将 ColumnType 添加到 project 子句,而不是修改表。 - 向谓词添加基于时间的筛选器。 使用日期/时间列值或 ingestion_time()。
- 搜索特定列而不是全文搜索。
- 最好不要引用出现在多个表中且具有多个类型的列。 如果在为多个类型解析此类列类型时谓词有效,则查询将回退到并集。 例如,请参阅将 find 用作 union 的案例示例。
示例
在当前数据库的所有表中进行字词查找
以下查询从当前数据库的所有表中查找其中的任意列包含单词 Hernandez
的所有行。 生成的记录根据输出架构进行转换。 输出包括来自 ContosoSales
数据库的 Customers
表和 SalesTable
表的行。
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 | 信息 | Some Text1 | v1.0.0 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 错误 | Some Text2 | v1.0.0 |
28b8e46e-3c31-43cf-83cb-48921c3986fc | 错误 | Some Text3 | v1.0.1 |
8f057b11-3281-45c3-a856-05ebb18a3c59 | 信息 | Some Text4 | v1.1.0 |
EventsTable2
Session_Id | 级别 | EventText | EventName |
---|---|---|---|
f7d5f95f-f580-4ea6-830b-5776c8d64fdd | 信息 | Some Other Text1 | Event1 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 信息 | Some Other Text2 | Event2 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | 错误 | Some Other Text3 | Event3 |
15eaeab5-8576-4b58-8fc6-478f75d8fee4 | 错误 | Some Other 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 | Some Text2 | v1.0.0 | {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"} | |
EventsTable2 | Some Other 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 | Some Text1 | v1.0.0 | |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Some Text2 | v1.0.0 | |
EventsTable2 | f7d5f95f-f580-4ea6-830b-5776c8d64fdd | Some Other Text1 | Event1 |
注意:在实践中,将使用 Version == 'v1.0.0'
谓词筛选 EventsTable1 行,使用 EventName == 'Event1'
谓词筛选 EventsTable2 行 。
使用缩写表示法在当前数据库的所有表中进行搜索
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
输出
source_ | Session_Id | 级别 | EventText | pack_ |
---|---|---|---|---|
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 信息 | Some Text1 | {"Version":"v1.0.0"} |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 错误 | Some Text2 | {"Version":"v1.0.0"} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 信息 | Some Other Text2 | {"EventName":"Event2"} |
EventsTable2 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | 错误 | Some Other 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)