Operações de cadeia de caracteres

Linguagem de Consulta Kusto (KQL) oferece vários operadores de consulta para pesquisar tipos de dados de cadeia de caracteres. O artigo a seguir descreve como os termos de cadeia de caracteres são indexados, lista os operadores de consulta de cadeia de caracteres e fornece dicas para otimizar o desempenho.

Noções básicas de termos de cadeia de caracteres

O Azure Data Explorer indexa todas as colunas, incluindo as colunas do tipo string. Vários índices são criados para essas colunas, dependendo dos dados reais. Esses índices não são expostos diretamente, mas usados em consultas com os operadores string que têm has como parte do nome deles, como has, !has, hasprefix, !hasprefix. A semântica desses operadores é determinada pela maneira como a coluna é codificada. Em vez de fazer uma correspondência de substring "simples", esses operadores fazem a correspondência de termos.

O que é uma termo?

Por padrão, cada string valor é dividido em sequências máximas de caracteres alfanuméricos e cada uma dessas sequências é transformada em um termo.

Por exemplo, em string a seguir, os termos são Kusto, KustoExplorerQueryRun e as seguintes substrings: ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.

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

O Kusto cria um índice de termos que consiste em todos os termos com três caracteres ou mais, e esse índice é usado por operadores de cadeia de caracteres como has, !has e assim por diante. Se a consulta procurar um termo menor que três caracteres ou usar um operador contains, ela será revertida para verificar os valores na coluna. A verificação é muito mais lenta do que pesquisar o termo no índice de termos.

Observação

No EngineV2, um termo consiste em quatro ou mais caracteres.

Operadores em cadeias de caracteres

As seguintes abreviações são usadas neste artigo:

  • RHS = lado direito da expressão
  • LHS = lado esquerdo da expressão

Os operadores com um sufixo _cs diferenciam maiúsculas de minúsculas.

Operador Descrição Diferencia maiúsculas de minúsculas Exemplo (suspende true)
== Igual a Sim "aBc" == "aBc"
!= Diferente de Sim "abc" != "ABC"
=~ Igual a Não "abc" =~ "ABC"
!~ Diferente de Não "aBc" !~ "xyz"
contains RHS ocorre como uma subsequência de LHS Não "FabriKam" contains "BRik"
!contains RHS não ocorre em LHS Não "Fabrikam" !contains "xyz"
contains_cs RHS ocorre como uma subsequência de LHS Sim "FabriKam" contains_cs "Kam"
!contains_cs RHS não ocorre em LHS Sim "Fabrikam" !contains_cs "Kam"
endswith RHS é uma subsequência de fechamento de LHS Não "Fabrikam" endswith "Kam"
!endswith RHS não é uma subsequência de fechamento de LHS Não "Fabrikam" !endswith "brik"
endswith_cs RHS é uma subsequência de fechamento de LHS Sim "Fabrikam" endswith_cs "kam"
!endswith_cs RHS não é uma subsequência de fechamento de LHS Sim "Fabrikam" !endswith_cs "brik"
has O lado direito (RHS) é um termo completo no lado esquerdo (LHS) Não "North America" has "america"
!has O RHS não é um termo completo no LHS Não "North America" !has "amer"
has_all O mesmo que has, mas funciona em todos os elementos Não "North and South America" has_all("south", "north")
has_any O mesmo que has, mas funciona em qualquer um dos elementos Não "North America" has_any("south", "north")
has_cs O RHS é um termo completo no LHS Sim "North America" has_cs "America"
!has_cs O RHS não é um termo completo no LHS Sim "North America" !has_cs "amer"
hasprefix O RHS é um prefixo de termo no LHS Não "North America" hasprefix "ame"
!hasprefix O RHS não é um prefixo de termo no LHS Não "North America" !hasprefix "mer"
hasprefix_cs O RHS é um prefixo de termo no LHS Sim "North America" hasprefix_cs "Ame"
!hasprefix_cs O RHS não é um prefixo de termo no LHS Sim "North America" !hasprefix_cs "CA"
hassuffix O RHS é um sufixo de termo no LHS Não "North America" hassuffix "ica"
!hassuffix O RHS não é um sufixo de termo no LHS Não "North America" !hassuffix "americ"
hassuffix_cs O RHS é um sufixo de termo no LHS Sim "North America" hassuffix_cs "ica"
!hassuffix_cs O RHS não é um sufixo de termo no LHS Sim "North America" !hassuffix_cs "icA"
in É igual a qualquer um dos elementos Sim "abc" in ("123", "345", "abc")
!in Não equivale a qualquer um dos elementos Sim "bca" !in ("123", "345", "abc")
in~ É igual a qualquer um dos elementos Não "Abc" in~ ("123", "345", "abc")
!in~ Não equivale a qualquer um dos elementos Não "bCa" !in~ ("123", "345", "ABC")
matches regex LHS contém uma correspondência para RHS Sim "Fabrikam" matches regex "b.*k"
startswith RHS é uma subsequência inicial de LHS Não "Fabrikam" startswith "fab"
!startswith RHS não é uma subsequência inicial de LHS Não "Fabrikam" !startswith "kam"
startswith_cs RHS é uma subsequência inicial de LHS Sim "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS não é uma subsequência inicial de LHS Sim "Fabrikam" !startswith_cs "fab"

Dicas de desempenho

Para obter melhor desempenho, quando há dois operadores que fazem a mesma tarefa, use um que diferencie maiúsculas de minúsculas. Por exemplo:

  • Usar ==, não =~
  • Usar in, não in~
  • Usar hassuffix_cs, não hassuffix

Para obter resultados mais rápidos, se você estiver testando se há um símbolo ou uma palavra alfanumérica associada a caracteres não alfanuméricos ou o início ou fim de um campo, use hasou in. has funciona mais rápido que contains, startswith ou endswith.

Para pesquisar endereços IPv4 ou seus prefixos, use um dos operadores especiais em endereços IPv4, que são otimizados para essa finalidade.

Para obter mais informações, confira as Melhores práticas para consulta.

Por exemplo, a primeira destas consultas será executada mais rapidamente:

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

Operadores em endereços IPv4

O grupo de operadores a seguir fornece pesquisa acelerada por índice em endereços IPv4 ou seus prefixos.

Operador Descrição Exemplo (suspende true)
has_ipv4 O LHS contém o endereço IPv4 representado pelo RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix O LHS contém um endereço IPv4 que corresponde a um prefixo representado pelo RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 O LHS contém um dos endereços IPv4 fornecidos pelo 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 O LHS contém um endereço IPv4 que corresponde a um dos prefixos fornecidos pelo RHS has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))