Utilice la función search() para realizar búsquedas de texto completo sobre datos de registro en instrucciones de análisis SQL.
Requisitos previos
Se creó un logstore estándar. Manage a LogStore.
Se recopilaron los datos de registro. Data ingestion overview.
Se creó un index con el modo de escaneo deshabilitado.
Ejemplos
Combinación con predicados SQL
Combine search() con predicados SQL mediante AND para lograr un filtrado más preciso.
-- search + comparison operator
* | SELECT * FROM log
WHERE search('status: 200') AND request_time > 100
-- search + IN clause
* | SELECT * FROM log
WHERE search('request_method: GET') AND status IN (200, 301, 302)
-- search + LIKE
* | SELECT * FROM log
WHERE search('status: 200') AND http_user_agent LIKE '%Chrome%'
-- search + BETWEEN
* | SELECT * FROM log
WHERE search('request_method: POST') AND request_time BETWEEN 100 AND 500
-- search + complex condition combination (OR cannot include search)
* | SELECT * FROM log
WHERE search('request_method: GET')
AND (status = 200 OR status = 302)
AND request_time > 50
Solo AND puede conectar
search()con otros predicados SQL.search()no puede aparecer en ninguna expresión OR. Por ejemplo,search('error') OR status = 500no está permitido.Se permite OR entre predicados SQL que no incluyen
search(). Por ejemplo,search('error') AND (status = 500 OR status = 502)sí está permitido.
Escenarios de JOIN de varias tablas
search() admite operaciones JOIN con varios logstores. Cada subconsulta aplica su propio filtro search() de forma independiente.
Cada subconsulta solo puede contener una llamada a search(). Un JOIN de varias tablas puede tener múltiples llamadas a search() porque cada search() pertenece a una subconsulta distinta.
Datos de muestra
Los siguientes ejemplos utilizan una tabla de pedidos (logstore orders) y una tabla de usuarios (logstore users).
Esquema de la tabla de pedidos (logstore orders):
|
Nombre del campo |
Tipo de campo |
Descripción |
|
order_id |
long |
ID del pedido |
|
user_id |
long |
ID de usuario, asociado a la tabla de usuarios |
|
status |
text |
Estado del pedido, como completado, pendiente o cancelado |
|
amount |
double |
Monto del pedido |
|
order_type |
text |
Tipo de pedido, como normal o vip |
Esquema de la tabla de usuarios (logstore users):
|
Nombre del campo |
Tipo de campo |
Descripción |
|
user_id |
long |
ID de usuario, clave principal |
|
username |
text |
Nombre de usuario |
|
region |
text |
Región donde se encuentra el usuario, como hangzhou, shanghai o beijing |
|
|
text |
Correo electrónico del usuario |
|
age |
long |
Edad del usuario |
INNER JOIN
Consulte los pedidos completados (status = completed) con usuarios correspondientes en la región hangzhou.
* | SELECT o.order_id, o.status, o.amount, u.username, u.region
FROM (
SELECT * FROM orders.log
WHERE search('status: completed')
) o
JOIN (
SELECT * FROM users.log
WHERE search('region: hangzhou')
) u
ON o.user_id = u.user_id
ORDER BY o.order_id
LEFT JOIN
Devuelva todos los pedidos completados y asocie solo los usuarios de la región shanghai. Los pedidos sin un usuario correspondiente muestran null en los campos relacionados con el usuario.
* | SELECT o.order_id, o.status, u.username, u.region
FROM (
SELECT * FROM orders.log
WHERE search('status: completed')
) o
LEFT JOIN (
SELECT * FROM users.log
WHERE search('region: shanghai')
) u
ON o.user_id = u.user_id
ORDER BY o.order_id
Self-join
En un self-join, aplique condiciones de búsqueda diferentes a subconsultas con alias distintos.
El siguiente ejemplo utiliza una tabla de empleados (logstore employees) con este esquema:
|
Nombre del campo |
Tipo de campo |
Descripción |
|
employee_id |
long |
ID del empleado |
|
employee_name |
text |
Nombre del empleado |
|
department |
text |
Departamento, como engineering o finance |
|
level |
text |
Nivel, como junior o senior |
|
manager_id |
long |
El employee_id del gerente |
Consulte los empleados del departamento de ingeniería junto con sus gerentes de nivel senior:
* | SELECT e.employee_name AS employee, e.department,
m.employee_name AS manager, m.level AS manager_level
FROM (
SELECT * FROM employees.log
WHERE search('department: engineering')
) e
JOIN (
SELECT * FROM employees.log
WHERE search('level: senior')
) m
ON e.manager_id = m.employee_id
ORDER BY e.employee_name
Límites
|
Límite |
Descripción |
|
Límite por instancia única |
Cada subconsulta solo puede contener una llamada a |
|
Límite del operador OR |
|
|
Límite del modo de escaneo |
La función search no es compatible con el modo de escaneo. |
|
Conflicto en la entrada de sintaxis de consulta |
|
|
Tipo de parámetro |
El parámetro de la función search debe ser una cadena literal. No se admiten valores dinámicos como referencias a columnas, variables o expresiones de función. |
Límites de uso combinado
|
Escenario |
Compatible |
Ejemplo |
|
Función search única |
|
|
|
search + AND + condición SQL |
|
|
|
search + AND + (c1 OR c2) |
|
|
|
Operador OR usado dentro de search |
|
|
|
search en cada subconsulta de un JOIN de varias tablas |
|
Cada subconsulta opera de forma independiente, sin afectar a las demás. |
|
Varias funciones search en la misma subconsulta |
|
En su lugar, utilice |
|
search + OR + condición SQL |
|
|
Mejores prácticas
Consolide las condiciones de consulta: Combine todas las condiciones de búsqueda de texto completo en una sola llamada a
search(). No se admiten múltiples llamadas asearch()en la misma subconsulta.Utilice consultas específicas por campo: Emplee el formato
field: valueen lugar de búsquedas generales de texto completo para mejorar la precisión y el rendimiento.Aproveche los tipos numéricos: Para campos long o double, use consultas de rango (
field in [min max]) en lugar de coincidencias de texto.Use rutas de subcampos para campos JSON: Especifique una ruta de subcampo precisa, como
content.status, para evitar coincidencias difusas en el nivel principal.Combine predicados SQL de manera eficaz: Utilice search() para el filtrado de texto completo y predicados SQL para comparaciones numéricas. Combínelos con AND para obtener tanto rendimiento como flexibilidad.
Preguntas frecuentes
Error: key (xxx) is not config as key value config
El campo consultado no tiene índice de campo. Revise su configuración de índices y cree un índice de campo para este campo.
Error: Multiple search() functions in a single query are not supported
Existen múltiples llamadas a search() en la misma subconsulta. Combínelas en una sola llamada; por ejemplo, cambie search('error') AND search('timeout') por search('error AND timeout').
Error: The search() function cannot be combined with OR operator
search() está conectado a otras condiciones mediante OR. Mueva la lógica OR dentro de la función search. Por ejemplo, cambie search('error') OR status = 500 por search('error OR status: 500').
Error: The search() function is not supported in scan mode
El modo de escaneo no admite search(). Cambie al modo de índice para utilizar esta función.