Оператор 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_. Если после сопоставления с подстановочными знаками запрос ссылается на таблицы из нескольких баз данных, включая базу данных по умолчанию, значение этого столбца будет иметь имя таблицы, указанное в базе данных. Аналогичным образом , квалификации кластера и базы данных будут присутствовать в значении, если указано несколько кластеров. | |
Предикат | 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
выражение над столбцами входных таблиц Таблица [,
Таблица, ...]. Он вычисляется для каждой строки в каждой входной таблице. Дополнительные сведения см. в разделе Предикат-синтаксис.Таблицы: необязательно. Ноль или более ссылок на таблицы с раздели-запятыми. По умолчанию поиск выполняет поиск по всем таблицам по следующим причинам:
- имя таблицы, например
Events
. - Выражение запроса, например
(Events | where id==42)
- Набор таблиц, указанных с помощью подстановочного знака. Например, будет формировать объединение всех таблиц,
E*
имена которых начинаются сE
.
- имя таблицы, например
project-smart
|project
: если значение не указаноproject-smart
, будет использоваться по умолчанию. Дополнительные сведения см. в разделе Сведения о схеме вывода.
Возвращаемое значение
Преобразование строк в таблице [,
Таблица, ...], для которой предикатом является true
. Строки преобразуются в соответствии со схемой вывода.
Схема вывода
столбец source_
Выходные данные оператора find всегда будут содержать столбец source_ с именем исходной таблицы. Столбец можно переименовать с помощью withsource
параметра .
столбцы результатов
Исходные таблицы, не содержащие столбцы, используемые при вычислении предиката, будут отфильтрованы.
При использовании project-smart
столбцы, которые будут отображаться в выходных данных, будут следующими:
- Столбцы, явно отображаемые в предикате.
- Столбцы, общие для всех отфильтрованные таблицы.
Остальные столбцы будут упакованы в контейнер свойств и будут отображаться в дополнительном pack
столбце.
Столбец, на который явно указывает предикат и который отображается в нескольких таблицах с несколькими типами, будет иметь разные столбцы в результирующей схеме для каждого такого типа. Каждое из имен столбцов будет построено на основе исходного имени и типа столбца, разделенных символом подчеркивания.
При использовании project
ColumnName[:
ColumnType,
... ] [,
pack_all()
]:
- Таблица результатов будет содержать столбцы, указанные в списке. Если исходная таблица не содержит определенного столбца, значения в соответствующих строках будут иметь значение NULL.
- При указании ColumnType с columnName этот столбец в "результате" будет иметь заданный тип, и при необходимости значения будут приведены к этому типу. Приведение не влияет на тип столбца при оценке предиката.
- При
pack_all()
использовании все столбцы, включая проецируемые столбцы, упаковываются в контейнер свойств и отображаются в дополнительном столбце по умолчанию column1. В контейнере свойств имя исходного столбца служит именем свойства, а значение столбца — значением свойства.
Синтаксис предиката
Оператор find поддерживает альтернативный синтаксис термина * has
и использует простой термин для поиска по всем входным столбцам.
Сводные сведения о некоторых функциях фильтрации см. в разделе оператор where.
Примечания
project
Если предложение ссылается на столбец, который отображается в нескольких таблицах и имеет несколько типов, тип должен соответствовать этой ссылке на столбец в предложении project.- Если столбец отображается в нескольких таблицах и имеет несколько типов и
project-smart
используется, для каждого типа вfind
результатах будет соответствующий столбец, как описано в объединении. - При использовании project-smart изменения в предикате, в наборе исходных таблиц или в схеме таблиц могут привести к изменению выходной схемы. Если требуется константная схема результатов, используйте проект .
find
область не может включать функции. Чтобы включить функцию в область поиска, определите оператор let с ключевое слово представления.
Советы по улучшению производительности
- Используйте таблицы , а не табличные выражения.
Если табличное выражение, оператор find возвращается к запросу
union
, что может привести к снижению производительности. - Если столбец, который отображается в нескольких таблицах и имеет несколько типов, является частью предложения проекта, рекомендуется добавить ColumnType в предложение проекта, а не изменить таблицу перед передачей
find
в . - Добавьте фильтры на основе времени в предикат. Используйте значение столбца datetime или ingestion_time().
- Поиск в определенных столбцах, а не полнотекстовый поиск.
- Лучше не ссылаться на столбцы, которые отображаются в нескольких таблицах и имеют несколько типов. Если предикат является допустимым при разрешении таких типов столбцов для нескольких типов, запрос будет возвращен к объединению. Например, см. примеры случаев, когда find будет выступать в качестве объединения.
Примеры
Поиск терминов во всех таблицах в текущей базе данных
Запрос находит все строки из всех таблиц в текущей базе данных, в которых любой столбец содержит слово 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 | Level | 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 | Level | EventText | EventName |
---|---|---|---|
f7d5f95f-f580-4ea6-830b-5776c8d64fdd | Сведения | Другой текст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 | v1.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 | v1.0.0 | |
EventsTable1 | acbd207d-51aa-4df7-bfa7-be70eb68f04e | Некоторый текст2 | v1.0.0 | |
EventsTable2 | f7d5f95f-f580-4ea6-830b-5776c8d64fdd | Другой текст1 | Событие1 |
Примечание. На практике строки EventsTable1 будут фильтроваться с Version == 'v1.0.0'
помощью предиката, а строки EventsTable2 будут фильтроваться с EventName == 'Event1'
помощью предиката.
Используйте сокращенную нотацию для поиска по всем таблицам в текущей базе данных.
find Session_Id == 'acbd207d-51aa-4df7-bfa7-be70eb68f04e'
Выходные данные
Источник_ | Session_Id | Level | 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)
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по