Поделиться через


Оператор 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[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)