Оператор 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 | projectColumnName[:ColumnType, ... ] [,pack_all()]]

  • findПредикат [project-smart | projectColumnName[: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 столбце. Столбец, на который явно указывает предикат и который отображается в нескольких таблицах с несколькими типами, будет иметь разные столбцы в результирующей схеме для каждого такого типа. Каждое из имен столбцов будет построено на основе исходного имени и типа столбца, разделенных символом подчеркивания.

При использовании projectColumnName[: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)