Partilhar via


Operadores de cadeia de caracteres

Aplica-se a: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Kusto Query Language (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 sobre termos de cadeia de caracteres

Kusto indexa todas as colunas, incluindo 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 são usados em consultas com os operadores de string que têm has como parte de seu nome, como has, !has, hasprefix, !hasprefix. A semântica destes operadores é ditada pela forma como a coluna é codificada. Em vez de fazer uma correspondência de substring "simples", esses operadores correspondem termos.

O que é um termo?

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

Por exemplo, no stringa seguir, os termos são Kusto, KustoExplorerQueryRune as seguintes substrings: ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.

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

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

Embora Explorer seja uma subseqüência de KustoExplorerQueryRun, "KustoExplorerQueryRun" has "Explorer" retornará false enquanto "KustoExplorerQueryRun" contains "Explorer" retornará true. Isso é sutil, mas o comportamento se deve ao fato de que has é baseado em termos.

Operadores em strings

As seguintes abreviaturas 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 Case-Sensitive Exemplo (rendimentos true)
== Igual Sim "aBc" == "aBc"
!= Não é igual Sim "abc" != "ABC"
=~ Igual Não "abc" =~ "ABC"
!~ Não é igual Não "aBc" !~ "xyz"
contains A RHS ocorre como uma subsequência da LHS Não "FabriKam" contains "BRik"
!contains A RHS não ocorre na LHS Não "Fabrikam" !contains "xyz"
contains_cs A RHS ocorre como uma subsequência da LHS Sim "FabriKam" contains_cs "Kam"
!contains_cs A RHS não ocorre na LHS Sim "Fabrikam" !contains_cs "Kam"
endswith RHS é uma subseqüência de fechamento de LHS Não "Fabrikam" endswith "Kam"
!endswith RHS não é uma subseqüência de fechamento de LHS Não "Fabrikam" !endswith "brik"
endswith_cs RHS é uma subseqüência de fechamento de LHS Sim "Fabrikam" endswith_cs "kam"
!endswith_cs RHS não é uma subseqüência de fechamento de LHS Sim "Fabrikam" !endswith_cs "brik"
has Lado direito (RHS) é um termo inteiro no lado esquerdo (LHS) Não "North America" has "america"
!has RHS não é um termo completo em 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 RHS é um termo inteiro em LHS Sim "North America" has_cs "America"
!has_cs RHS não é um termo completo em LHS Sim "North America" !has_cs "amer"
hasprefix RHS é um prefixo de termo em LHS Não "North America" hasprefix "ame"
!hasprefix RHS não é um prefixo de termo em LHS Não "North America" !hasprefix "mer"
hasprefix_cs RHS é um prefixo de termo em LHS Sim "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS não é um prefixo de termo em LHS Sim "North America" !hasprefix_cs "CA"
hassuffix RHS é um sufixo de termo em LHS Não "North America" hassuffix "ica"
!hassuffix RHS não é um sufixo de termo em LHS Não "North America" !hassuffix "americ"
hassuffix_cs RHS é um sufixo de termo em LHS Sim "North America" hassuffix_cs "ica"
!hassuffix_cs RHS não é um sufixo de termo em LHS Sim "North America" !hassuffix_cs "icA"
in Igual a qualquer um dos elementos Sim "abc" in ("123", "345", "abc")
!in Não é igual a nenhum 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 é igual a nenhum 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 subseqüê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 subseqüência inicial de LHS Sim "Fabrikam" !startswith_cs "fab"

Dicas de desempenho

Para um melhor desempenho, quando houver dois operadores que façam a mesma tarefa, use o que diferencia maiúsculas de minúsculas. Por exemplo:

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

Para obter resultados mais rápidos, se você estiver testando a presença de um símbolo ou palavra alfanumérica vinculada por caracteres não alfanuméricos ou o início ou o fim de um campo, use has ou in. has funciona mais rápido do que contains, startswithou endswith.

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

Para obter mais informações, consulte Práticas recomendadas de consulta.

Por exemplo, a primeira dessas 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 (rendimentos true)
has_ipv4 LHS contém endereço IPv4 representado por RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS contém um endereço IPv4 que corresponde a um prefixo representado por RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS contém um dos endereços IPv4 fornecidos pela 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 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."]))