Оператор find
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅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
[ColumnName] [withsource
=(
in
Таблицы)
]where
Предикат [project-smart
|project
ColumnName[:
ColumnType,
... ] [ ],
pack_all()
]find
Предикат [project-smart
|project
ColumnName[:
ColumnType,
... ] [ ]],
pack_all()
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
ColumnName | string |
По умолчанию выходные данные будут содержать столбец с именем source_ , значения которых указывают, какая исходная таблица внесла каждую строку. Если задано, имя столбца будет использоваться вместо source_. После сопоставления подстановочных знаков, если запрос ссылается на таблицы из нескольких баз данных, включая базу данных по умолчанию, значение этого столбца будет иметь имя таблицы с базой данных. Кроме того, квалификация кластера и базы данных будет присутствовать в значении, если на нее ссылается несколько кластеров. | |
Предикат | bool |
✔️ | Это логическое выражение вычисляется для каждой строки в каждой входной таблице. Дополнительные сведения см. в сведениях о синтаксисе предиката. |
Таблицы | string |
Ноль или несколько ссылок на таблицы с разделим запятыми. По умолчанию find будет выглядеть во всех таблицах текущей базы данных. Вы можете использовать:1. Имя таблицы, например Events 2. Выражение запроса, например (Events | where id==42) 3. Набор таблиц, указанных подстановочным знаком. Например, E* будет формироваться объединение всех таблиц в базе данных, имена которых начинаются с E . |
|
project-smart или project |
string |
Если не указано, project-smart будет использоваться по умолчанию. Дополнительные сведения см. в разделе сведений о выходной схеме. |
withsource=
ColumnName: необязательно. По умолчанию выходные данные будут содержать столбец с именем source_ , значения которого указывают, какая исходная таблица способствовала каждой строке. Если задано, имя столбца будет использоваться вместо source_.Предикат:
boolean
выражение по столбцам входных таблиц [ Таблица,,
...]. Он вычисляется для каждой строки в каждой входной таблице. Дополнительные сведения см. в сведениях о синтаксисе предиката.Таблицы: необязательно. Ноль или несколько ссылок на таблицы с разделим запятыми. По умолчанию поиск будет выполнять поиск по всем таблицам:
- имя таблицы, например
Events
. - Выражение запроса, например
(Events | where id==42)
- Набор таблиц, указанных с помощью подстановочного знака. Например,
E*
будет формировать объединение всех таблиц, имена которых начинаются сE
.
- имя таблицы, например
project-smart
|project
: если не указаноproject-smart
, будет использоваться по умолчанию. Дополнительные сведения см. в разделе сведений о выходной схеме.
Возвраты
Преобразование строк в таблице [,
таблица, ...], для которой задан true
предикат. Строки преобразуются в соответствии с выходной схемой.
Выходная схема
столбец source_
Выходные данные оператора поиска всегда будут содержать столбец source_ с именем исходной таблицы. Столбец можно переименовать с помощью withsource
параметра.
Столбцы результатов
Исходные таблицы, не содержащие столбец, используемый вычислением предиката, будут отфильтрованы.
При использовании project-smart
столбцы, которые будут отображаться в выходных данных, будут:
- Столбцы, которые отображаются явно в предикате.
- Столбцы, общие для всех отфильтрованные таблицы.
Остальные столбцы будут упакованы в контейнер свойств и будут отображаться в дополнительном pack
столбце.
Столбец, на который явно ссылается предикат и отображается в нескольких таблицах с несколькими типами, будет иметь другой столбец в схеме результатов для каждого такого типа. Каждое из имен столбцов будет создано из исходного имени столбца и типа, разделенного подчеркиванием.
При использовании project
ColumnName[:
ColumnType ,
... ] [,
pack_all()
]:
- В таблице результатов будут указаны столбцы, указанные в списке. Если исходная таблица не содержит определенный столбец, значения в соответствующих строках будут иметь значение NULL.
- При указании ColumnType с именем ColumnName этот столбец в результирующем типе будет иметь заданный тип, и при необходимости значения будут приведение к этому типу. Приведение не влияет на тип столбца при оценке предиката.
- При
pack_all()
использовании все столбцы, включая проецируемые столбцы, упаковываются в контейнер свойств и отображаются в дополнительном столбце по умолчанию "column1". В контейнере свойств имя исходного столбца служит именем свойства, а значение столбца служит значением свойства.
Синтаксис предиката
Оператор find поддерживает альтернативный синтаксис для * has
термина и использует только термин, будет искать термин во всех входных столбцах.
Сводка по некоторым функциям фильтрации см. в разделе о том, где оператор.
Примечания.
project
Если предложение ссылается на столбец, который отображается в нескольких таблицах и содержит несколько типов, тип должен соответствовать ссылке на этот столбец в предложении проекта.- Если столбец отображается в нескольких таблицах и имеет несколько типов и
project-smart
используется, в результате каждого типа будет соответствующий столбец, как описано вfind
союзе. - При использовании project-smart изменения предиката в наборе исходных таблиц или в схеме таблиц могут привести к изменению выходной схемы. Если требуется константная схема результата, используйте проект вместо него.
find
область не может включать функции. Чтобы включить функцию в область поиска, определите оператор let с ключевым словом view.
Советы по производительности
- Используйте таблицы в отличие от табличных выражений.
Если табличное выражение, оператор поиска возвращается к запросу
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"
Поиск терминов во всех таблицах
Запрос находит все строки из всех таблиц, в которых любой столбец содержит слово Kusto
.
Полученные записи преобразуются в соответствии с выходной схемой.
find "Kusto"
Примеры выходных find
результатов
В следующих примерах показано, как find
можно использовать в двух таблицах: EventsTable1 и EventsTable2.
Предположим, что у нас есть следующее содержимое этих двух таблиц:
EventsTable1
Session_Id | Уровень | EventText | Версия |
---|---|---|---|
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Информация | Некоторые текст1 | Версия 1.0.0 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Ошибка | Некоторые текст2 | Версия 1.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-5776c8d64fd | Информация | Другой текст1 | Событие1 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Информация | Некоторые другие текст2 | Событие2 |
acbd207d-51aa-4df7-bfa7-be70eb68f04e | Ошибка | Некоторые другие текст3 | Событие3 |
15eaeab5-8576-4b58-8fc6-478f75d8fee4 | Ошибка | Некоторые другие текст4 | Событие4 |
Поиск в общих столбцах, общих и необычных столбцах проекта и упаковка остальных столбцов
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 | Версия 1.0.0 | {"Session_Id":"acbd207d-51aa-4df7-bfa7-be70eb68f04e", "Level":"Error"} | |
EventsTable2 | Некоторые другие текст3 | Событие3 | {"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 | Версия 1.0.0 | |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Некоторые текст2 | Версия 1.0.0 | |
EventsTable2 | f7d5f95f-f580-4ea6-830b-5776c8d64fd | Другой текст1 | Событие1 |
Примечание. На практике строки 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 | {"Версия":"v1.0.0"} |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Ошибка | Некоторые текст2 | {"Версия":"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)