Строковые операторы

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

язык запросов Kusto (KQL) предлагает различные операторы запросов для поиска строковых типов данных. В следующей статье описывается индексирование строковых терминов, приводится список строковых операторов запроса и даются советы по оптимизации производительности.

Общие сведения о строковых терминах

Kusto индексирует все столбцы, включая столбцы типа string. В зависимости от фактических данных для таких столбцов создается несколько индексов. Эти индексы не предоставляются напрямую. Они используются в запросах с операторами string, в имени которых содержится has, например has, !has, hasprefix, !hasprefix. Семантика этих операторов определяется способом кодирования столбца. Вместо того чтобы выполнять "обычное" сопоставление подстроки, эти операторы сопоставляют термины.

Что такое термин?

По умолчанию каждое string значение разбивается на максимальные последовательности буквенно-цифровых символов, и каждая из этих последовательностей преобразуется в термин.

Например, в следующем операторе stringтерминами являются Kusto, KustoExplorerQueryRunи следующие подстроки: ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.

Kusto: ad67d136-c1db-4f9f-88ef-d94f3b6b0b5a;KustoExplorerQueryRun

Kusto создает индекс терминов, состоящий из всех терминов, которые составляют три или более символов, и этот индекс используется has, !has и т. д. Если запрос ищет термин, который содержит менее трех символов или использует оператор contains, запрос продолжит проверять значения в столбце. Проверка выполняется намного медленнее, чем поиск термина в индексе терминов.

Операторы в строках

В этой статье используются следующие сокращены:

  • ПЧ = правая часть выражения
  • ЛЧ = левая часть выражения

Операторы с суффиксом _cs учитывают регистр.

Operator Description С учетом регистра Пример (при true)
== Равно Да "aBc" == "aBc"
!= Не равно Да "abc" != "ABC"
=~ Равно No "abc" =~ "ABC"
!~ Не равно No "aBc" !~ "xyz"
contains Правая часть является вхождением в левую часть No "FabriKam" contains "BRik"
!contains RHS не возникает в LHS No "Fabrikam" !contains "xyz"
contains_cs Правая часть является вхождением в левую часть Да "FabriKam" contains_cs "Kam"
!contains_cs RHS не возникает в LHS Да "Fabrikam" !contains_cs "Kam"
endswith RHS — это закрывающая подсезона LHS No "Fabrikam" endswith "Kam"
!endswith RHS не является закрывающим подсверждением LHS No "Fabrikam" !endswith "brik"
endswith_cs RHS — это закрывающая подсезона LHS Да "Fabrikam" endswith_cs "kam"
!endswith_cs RHS не является закрывающим подсверждением LHS Да "Fabrikam" !endswith_cs "brik"
has Правая часть представляет собой все слово в левой части No "North America" has "america"
!has ПЧ не является полным термином в ЛЧ No "North America" !has "amer"
has_all Аналогичен has, но работает со всеми элементами No "North and South America" has_all("south", "north")
has_any Аналогичен has, но работает с любыми элементами No "North America" has_any("south", "north")
has_cs ПЧ представляет целый термин в ЛЧ Да "North America" has_cs "America"
!has_cs ПЧ не является полным термином в ЛЧ Да "North America" !has_cs "amer"
hasprefix ПЧ является префиксом термина в ЛЧ No "North America" hasprefix "ame"
!hasprefix ПЧ не является префиксом термина в ЛЧ No "North America" !hasprefix "mer"
hasprefix_cs ПЧ является префиксом термина в ЛЧ Да "North America" hasprefix_cs "Ame"
!hasprefix_cs ПЧ не является префиксом термина в ЛЧ Да "North America" !hasprefix_cs "CA"
hassuffix ПЧ является суффиксом термина в ЛЧ No "North America" hassuffix "ica"
!hassuffix ПЧ не является суффиксом термина в ЛЧ No "North America" !hassuffix "americ"
hassuffix_cs ПЧ является суффиксом термина в ЛЧ Да "North America" hassuffix_cs "ica"
!hassuffix_cs ПЧ не является суффиксом термина в ЛЧ Да "North America" !hassuffix_cs "icA"
in Равно любому из элементов Да "abc" in ("123", "345", "abc")
!in Не соответствует одному из элементов Да "bca" !in ("123", "345", "abc")
in~ Равно любому из элементов No "Abc" in~ ("123", "345", "abc")
!in~ Не соответствует одному из элементов No "bCa" !in~ ("123", "345", "ABC")
matches regex Левая часть содержит соответствие для правой части Да "Fabrikam" matches regex "b.*k"
startswith RHS — это начальная подсефференция LHS No "Fabrikam" startswith "fab"
!startswith RHS не является начальным вложенным значением LHS No "Fabrikam" !startswith "kam"
startswith_cs RHS — это начальная подсефференция LHS Да "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS не является начальным вложенным значением LHS Да "Fabrikam" !startswith_cs "fab"

Советы по производительности

Для повышения производительности при наличии двух операторов, которые выполняют одну и ту же задачу, используйте тот, который учитывает регистр. Например:

  • Использование ==, а не =~
  • Использование in, а не in~
  • Использование hassuffix_cs, а не hassuffix

Для ускорения результатов при тестировании на наличие символа или буквенно-цифрового слова, которое связано с символами, отличными от алфавитных символов, или в начале или в конце поля используйте has или in. has выполняется быстрее, чем contains, startswithили endswith.

Для поиска адресов IPv4 или их префиксов используйте один из специальных операторов для IPv4-адресов, оптимизированных для этой цели.

Дополнительные сведения см. в рекомендациях по запросам.

Например, первый из этих запросов будет выполняться быстрее:

StormEvents | where State has "North" | count;
StormEvents | where State contains "nor" | count

Операторы iPv4-адресов

Следующая группа операторов предоставляет ускоренный поиск индекса по адресам IPv4 или их префиксам.

Operator Description Пример (при true)
has_ipv4 LHS содержит IPv4-адрес, представленный RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS содержит IPv4-адрес, соответствующий префиксу, представленному RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS содержит один из IPv4-адресов, предоставляемых RHS has_any_ipv4("Source address is 10.1.2.3:1234", dynamic(["10.1.2.3", "127.0.0.1"]))
has_any_ipv4_prefix LHS содержит IPv4-адрес, соответствующий одному из префиксов, предоставляемых RHS. has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))