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

Kusto предлагает различные операторы запросов для поиска строковых типов данных.Kusto offers a variety of query operators for searching string data types. В следующей статье описывается индексирование строковых терминов, приводится список строковых операторов запроса и даются советы по оптимизации производительности.The following article describes how string terms are indexed, lists the string query operators, and gives tips for optimizing performance.

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

Kusto индексирует все столбцы, включая столбцы типа string.Kusto indexes all columns, including columns of type string. В зависимости от фактических данных для таких столбцов создается несколько индексов.Multiple indexes are built for such columns, depending on the actual data. Эти индексы не предоставляются напрямую. Они используются в запросах с операторами string, в имени которых содержится has, например has, !has, hasprefix, !hasprefix.These indexes aren't directly exposed, but are used in queries with the string operators that have has as part of their name, such as has, !has, hasprefix, !hasprefix. Семантика этих операторов определяется способом кодирования столбца.The semantics of these operators are dictated by the way the column is encoded. Вместо того чтобы выполнять "обычное" сопоставление подстроки, эти операторы сопоставляют термины.Instead of doing a "plain" substring match, these operators match terms.

Что такое термин?What is a term?

По умолчанию каждое значение string разбивается на максимальные последовательности буквенно-цифровых символов ASCII, и каждая из этих последовательностей превращается в термин.By default, each string value is broken into maximal sequences of ASCII alphanumeric characters, and each of those sequences is made into a term. Например, в следующем операторе stringтерминами являются Kusto, KustoExplorerQueryRunи следующие подстроки: ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.For example, in the following string, the terms are Kusto, KustoExplorerQueryRun, and the following substrings: ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.

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

Kusto создает индекс терминов, состоящий из всех терминов, которые составляют три или более символов, и этот индекс используется has, !has и т. д.Kusto builds a term index consisting of all terms that are three characters or more, and this index is used by string operators such as has, !has, and so on. Если запрос ищет термин, который содержит менее трех символов или использует оператор contains, запрос продолжит проверять значения в столбце.If the query looks for a term that is smaller than three characters, or uses a contains operator, then the query will revert to scanning the values in the column. Проверка выполняется намного медленнее, чем поиск термина в индексе терминов.Scanning is much slower than looking up the term in the term index.

Примечание

В EngineV2 термин состоит из четырех или более символов.In EngineV2, a term consists of four or more characters.

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

Примечание

В таблице используются следующие сокращения:The following abbreviations are used in the table below:

  • ПЧ = правая часть выраженияRHS = right hand side of the expression
  • ЛЧ = левая часть выраженияLHS = left hand side of the expression

Операторы с суффиксом _cs учитывают регистр.Operators with an _cs suffix are case sensitive.

Примечание

Операторы, работающие без учета регистра, сейчас поддерживают только текст ASCII.Case-insensitive operators are currently supported only for ASCII-text. Для сравнения работы со схемами, отличными от ASCII, используйте функцию tolower().For non-ASCII comparison, use the tolower() function.

ОператорOperator ОписаниеDescription С учетом регистраCase-Sensitive Пример (при true)Example (yields true)
== РавноEquals ДаYes "aBc" == "aBc"
!= Не равноNot equals ДаYes "abc" != "ABC"
=~ РавноEquals НетNo "abc" =~ "ABC"
!~ Не равноNot equals НетNo "aBc" !~ "xyz"
has Правая часть представляет собой все слово в левой частиRight-hand-side (RHS) is a whole term in left-hand-side (LHS) НетNo "North America" has "america"
!has ПЧ не является полным термином в ЛЧRHS isn't a full term in LHS НетNo "North America" !has "amer"
has_all Аналогичен has, но работает со всеми элементамиSame as has but works on all of the elements НетNo "North and South America" has_all("south", "north")
has_any Аналогичен has, но работает с любыми элементамиSame as has but works on any of the elements НетNo "North America" has_any("south", "north")
has_cs ПЧ представляет целый термин в ЛЧRHS is a whole term in LHS ДаYes "North America" has_cs "America"
!has_cs ПЧ не является полным термином в ЛЧRHS isn't a full term in LHS ДаYes "North America" !has_cs "amer"
hasprefix ПЧ является префиксом термина в ЛЧRHS is a term prefix in LHS НетNo "North America" hasprefix "ame"
!hasprefix ПЧ не является префиксом термина в ЛЧRHS isn't a term prefix in LHS НетNo "North America" !hasprefix "mer"
hasprefix_cs ПЧ является префиксом термина в ЛЧRHS is a term prefix in LHS ДаYes "North America" hasprefix_cs "Ame"
!hasprefix_cs ПЧ не является префиксом термина в ЛЧRHS isn't a term prefix in LHS ДаYes "North America" !hasprefix_cs "CA"
hassuffix ПЧ является суффиксом термина в ЛЧRHS is a term suffix in LHS НетNo "North America" hassuffix "ica"
!hassuffix ПЧ не является суффиксом термина в ЛЧRHS isn't a term suffix in LHS НетNo "North America" !hassuffix "americ"
hassuffix_cs ПЧ является суффиксом термина в ЛЧRHS is a term suffix in LHS ДаYes "North America" hassuffix_cs "ica"
!hassuffix_cs ПЧ не является суффиксом термина в ЛЧRHS isn't a term suffix in LHS ДаYes "North America" !hassuffix_cs "icA"
contains RHS возникает как последовательность LHSRHS occurs as a subsequence of LHS НетNo "FabriKam" contains "BRik"
!contains RHS не возникает в LHSRHS doesn't occur in LHS НетNo "Fabrikam" !contains "xyz"
contains_cs RHS возникает как последовательность LHSRHS occurs as a subsequence of LHS ДаYes "FabriKam" contains_cs "Kam"
!contains_cs RHS не возникает в LHSRHS doesn't occur in LHS ДаYes "Fabrikam" !contains_cs "Kam"
startswith RHS является начальной последовательностью LHSRHS is an initial subsequence of LHS НетNo "Fabrikam" startswith "fab"
!startswith RHS не является начальной последовательностью LHSRHS isn't an initial subsequence of LHS НетNo "Fabrikam" !startswith "kam"
startswith_cs RHS является начальной последовательностью LHSRHS is an initial subsequence of LHS ДаYes "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS не является начальной последовательностью LHSRHS isn't an initial subsequence of LHS ДаYes "Fabrikam" !startswith_cs "fab"
endswith RHS является закрывающей последовательностью LHSRHS is a closing subsequence of LHS НетNo "Fabrikam" endswith "Kam"
!endswith RHS не является закрывающей последовательностью LHSRHS isn't a closing subsequence of LHS НетNo "Fabrikam" !endswith "brik"
endswith_cs RHS является закрывающей последовательностью LHSRHS is a closing subsequence of LHS ДаYes "Fabrikam" endswith_cs "kam"
!endswith_cs RHS не является закрывающей последовательностью LHSRHS isn't a closing subsequence of LHS ДаYes "Fabrikam" !endswith_cs "brik"
matches regex LHS содержит совпадение для RHSLHS contains a match for RHS ДаYes "Fabrikam" matches regex "b.*k"
in Соответствует одному из элементовEquals to one of the elements ДаYes "abc" in ("123", "345", "abc")
!in Не соответствует одному из элементовNot equals to any of the elements ДаYes "bca" !in ("123", "345", "abc")
in~ Соответствует одному из элементовEquals to one of the elements НетNo "abc" in~ ("123", "345", "ABC")
!in~ Не соответствует одному из элементовNot equals to any of the elements НетNo "bca" !in~ ("123", "345", "ABC")

Совет

Все операторы, содержащие поиск с has по индексированным терминам размером более четырех символов, а не по соответствиям подстрок.All operators containing has search on indexed terms of four or more characters, and not on substring matches. Термин создается путем разбиения строки на последовательности буквенно-цифровых символов ASCII.A term is created by breaking up the string into sequences of ASCII alphanumeric characters. См. раздел Общие сведения о строковых терминах.See understanding string terms.

Советы по улучшению производительностиPerformance tips

Для повышения производительности при наличии двух операторов, которые выполняют одну и ту же задачу, используйте тот, который учитывает регистр.For better performance, when there are two operators that do the same task, use the case-sensitive one. Пример:For example:

  • вместо=~ используйте ==.instead of =~, use ==
  • вместоin~ используйте in.instead of in~, use in
  • вместоcontains используйте contains_cs.instead of contains, use contains_cs

Для ускорения результатов при тестировании на наличие символа или буквенно-цифрового слова, которое связано с символами, отличными от алфавитных символов, или в начале или в конце поля используйте has или in.For faster results, if you're testing for the presence of a symbol or alphanumeric word that is bound by non-alphanumeric characters, or the start or end of a field, use has or in. has выполняется быстрее, чем contains, startswithили endswith.has works faster than contains, startswith, or endswith.

Например, первый из этих запросов будет выполняться быстрее:For example, the first of these queries will run faster:

EventLog | where continent has "North" | count;
EventLog | where continent contains "nor" | count