Строковые операторы
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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."])) |