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

язык запросов 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, запрос продолжит проверять значения в столбце. Проверка выполняется намного медленнее, чем поиск термина в индексе терминов.

Примечание

В EngineV2 термин состоит из четырех или более символов.

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

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

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

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

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

Оператор Описание Пример (при 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."]))