Operadores de cadena
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
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.
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.
Operator | Descripción | Distingue mayúsculas de minúsculas | Ejemplo (produce true ) |
---|---|---|---|
== |
Igual a | Sí | "aBc" == "aBc" |
!= |
Not Equals | Sí | "abc" != "ABC" |
=~ |
Igual a | 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 | Sí | "FabriKam" contains_cs "Kam" |
!contains_cs |
RHS no se produce en LHS | Sí | "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 | Sí | "Fabrikam" endswith_cs "kam" |
!endswith_cs |
RHS no es una subsecuencia de cierre de LHS | Sí | "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 | Sí | "North America" has_cs "America" |
!has_cs |
RHS no es un término completo en LHS | Sí | "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 | Sí | "North America" hasprefix_cs "Ame" |
!hasprefix_cs |
RHS no es un prefijo del término en LHS | Sí | "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 | Sí | "North America" hassuffix_cs "ica" |
!hassuffix_cs |
RHS no es un sufijo del término en LHS | Sí | "North America" !hassuffix_cs "icA" |
in |
Es igual a cualquiera de los elementos | Sí | "abc" in ("123", "345", "abc") |
!in |
No es igual a uno de los elementos | Sí | "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 | Sí | "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. | Sí | "Fabrikam" startswith_cs "Fab" |
!startswith_cs |
RHS no es una subsecuencia inicial de LHS | Sí | "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
, noin~
- Usar
hassuffix_cs
, nohassuffix
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 propósito.
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 búsqueda acelerada por índice en direcciones IPv4 o sus prefijos.
Operator | 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."])) |