Operadores de cadena

Lenguaje de consulta Kusto (KQL) ofrece varios operadores de consulta para buscar tipos de datos de cadena. En el siguiente artículo se describe cómo se indexan los términos de cadena, se enumeran los operadores de consulta de cadena y se ofrecen sugerencias para optimizar el rendimiento.

Descripción de los términos de cadena

Kusto indexa todas las columnas, incluidas las columnas de tipo string. En función de los datos reales se crean varios índices para estas columnas. Estos índices no se exponen directamente, pero se usan en consultas con los operadores string que tienen has como parte de su nombre, por ejemplo: has, !has, hasprefix!hasprefix. La semántica de estos operadores viene determinada por la manera en que se codifica la columna. En lugar de realizar una coincidencia de subcadena "sin formato", estos operadores hacen coincidir términos.

¿Qué es un término?

De forma predeterminada, cada string valor se divide en secuencias máximas de caracteres alfanuméricos y cada una de esas secuencias se convierte en un término.

Por ejemplo, en la siguiente string, los términos son Kusto, KustoExplorerQueryRun, y las subcadenas siguientes: ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.

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

Kusto crea un índice de términos que consta de todos los términos que tienen tres caracteres o más y los operadores de cadena has, !has, etc., usan este índice. Si la consulta busca un término de menos de tres caracteres o usa un operador contains, la consulta pasará a examinar los valores de la columna. Este examen es mucho más lento que buscar el término en el índice de términos.

Nota

En EngineV2, un término consta de cuatro o más caracteres.

Operadores en cadenas

En este artículo se usan las abreviaturas siguientes:

  • RHS = lado derecho de la expresión
  • LHS = lado izquierdo de la expresión

Los operadores con un sufijo _cs distinguen mayúsculas de minúsculas.

Operador Descripción Distingue mayúsculas de minúsculas Ejemplo (produce true)
== Equals "aBc" == "aBc"
!= Not Equals "abc" != "ABC"
=~ Equals No "abc" =~ "ABC"
!~ Not Equals No "aBc" !~ "xyz"
contains RHS ocurre como una subsecuencia de LHS No "FabriKam" contains "BRik"
!contains RHS no se produce en LHS No "Fabrikam" !contains "xyz"
contains_cs RHS ocurre como una subsecuencia de LHS "FabriKam" contains_cs "Kam"
!contains_cs RHS no se produce en LHS "Fabrikam" !contains_cs "Kam"
endswith RHS es una subsecuencia de cierre de LHS No "Fabrikam" endswith "Kam"
!endswith RHS no es una subsecuencia de cierre de LHS No "Fabrikam" !endswith "brik"
endswith_cs RHS es una subsecuencia de cierre de LHS "Fabrikam" endswith_cs "kam"
!endswith_cs RHS no es una subsecuencia de cierre de LHS "Fabrikam" !endswith_cs "brik"
has El lado derecho (RHS) es un término completo en el lado izquierdo (LHS) No "North America" has "america"
!has RHS no es un término completo en LHS No "North America" !has "amer"
has_all Igual que has, pero funciona en todos los elementos No "North and South America" has_all("south", "north")
has_any Igual que has, pero funciona en cualquiera de los elementos No "North America" has_any("south", "north")
has_cs RHS es un término completo en LHS "North America" has_cs "America"
!has_cs RHS no es un término completo en LHS "North America" !has_cs "amer"
hasprefix RHS es un prefijo del término en LHS No "North America" hasprefix "ame"
!hasprefix RHS no es un prefijo del término en LHS No "North America" !hasprefix "mer"
hasprefix_cs RHS es un prefijo del término en LHS "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS no es un prefijo del término en LHS "North America" !hasprefix_cs "CA"
hassuffix RHS es un sufijo del término en LHS No "North America" hassuffix "ica"
!hassuffix RHS no es un sufijo del término en LHS No "North America" !hassuffix "americ"
hassuffix_cs RHS es un sufijo del término en LHS "North America" hassuffix_cs "ica"
!hassuffix_cs RHS no es un sufijo del término en LHS "North America" !hassuffix_cs "icA"
in Es igual a cualquiera de los elementos "abc" in ("123", "345", "abc")
!in No es igual a uno de los elementos "bca" !in ("123", "345", "abc")
in~ Es igual a cualquiera de los elementos No "Abc" in~ ("123", "345", "abc")
!in~ No es igual a uno de los elementos No "bCa" !in~ ("123", "345", "ABC")
matches regex LHS contiene una coincidencia para RHS "Fabrikam" matches regex "b.*k"
startswith RHS es una subsecuencia inicial de LHS No "Fabrikam" startswith "fab"
!startswith RHS no es una subsecuencia inicial de LHS No "Fabrikam" !startswith "kam"
startswith_cs RHS es una subsecuencia inicial de LHS "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS no es una subsecuencia inicial de LHS "Fabrikam" !startswith_cs "fab"

Consejos de rendimiento

Para mejorar el rendimiento, cuando haya dos operadores que realicen la misma tarea, use el que distinga mayúsculas de minúsculas. Por ejemplo:

  • Usar ==, no =~
  • Usar in, no in~
  • Usar hassuffix_cs, no hassuffix

Para obtener resultados más rápidos, si va a probar la presencia de un símbolo o una palabra alfanumérica delimitada por caracteres no alfanuméricos, o el inicio o el final del campo, use has o in. has funciona con mayor rapidez que contains, startswith o endswith.

Para buscar direcciones IPv4 o sus prefijos, use uno de los operadores especiales en direcciones IPv4, que están optimizados para este fin.

Para más información, consulte Procedimientos recomendados sobre las consultas.

Por ejemplo, la primera de estas consultas se ejecutará más rápido:

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

Operadores en direcciones IPv4

El siguiente grupo de operadores proporciona la búsqueda acelerada de índices en direcciones IPv4 o sus prefijos.

Operador Descripción Ejemplo (produce true)
has_ipv4 LHS contiene la dirección IPv4 representada por RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS contiene una dirección IPv4 que coincide con un prefijo representado por RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS contiene una de las direcciones IPv4 proporcionadas por 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 contiene una dirección IPv4 que coincide con uno de los prefijos proporcionados por RHS. has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))