Operadores de cadeias

Linguagem de Pesquisa Kusto (KQL) oferece vários operadores de consulta para procurar tipos de dados de cadeias. O artigo seguinte descreve como os termos de cadeia são indexados, lista os operadores de consulta de cadeia e dá sugestões para otimizar o desempenho.

Compreender os termos da cadeia

O Kusto indexa todas as colunas, incluindo colunas do tipo string. São criados vários índices para essas colunas, consoante os dados reais. Estes índices não são expostos diretamente, mas são utilizados em consultas com os string operadores que têm has como parte do respetivo 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 subcadeia "simples", estes operadores correspondem aos termos.

O que é um termo?

Por predefinição, cada string valor é dividido em sequências máximas de carateres alfanuméricos e cada uma dessas sequências é transformada num termo.

Por exemplo, nos seguintes string, os termos são Kusto, KustoExplorerQueryRune as seguintes subcadeias: 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 que são três carateres ou mais e este índice é utilizado por operadores de cadeia, como has, !hase assim sucessivamente. Se a consulta procurar um termo com menos de três carateres ou utilizar um contains operador, a consulta reverterá para a análise dos valores na coluna. A análise é muito mais lenta do que procurar o termo no índice de termos.

Nota

Em EngineV2, um termo consiste em quatro ou mais carateres.

Operadores em cadeias

As seguintes abreviaturas são utilizadas neste artigo:

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

Os operadores com sufixo _cs são sensíveis a maiúsculas e minúsculas.

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

Sugestões de desempenho

Para um melhor desempenho, quando existem dois operadores que fazem a mesma tarefa, utilize o sensível às maiúsculas e minúsculas. Por exemplo:

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

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

Para procurar endereços IPv4 ou respetivos prefixos, utilize um dos operadores especiais em endereços IPv4, que estão otimizados para esta finalidade.

Para obter mais informações, veja Melhores práticas de 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 seguinte grupo de operadores fornece pesquisa acelerada por índices em endereços IPv4 ou nos respetivos prefixos.

Operador Descrição Exemplo (rendimentos 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 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 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."]))