Utilize a função search() para executar buscas de texto completo em dados de log dentro de instruções analíticas SQL.
Pré-requisitos
Um LogStore Standard foi criado. Gerencie um LogStore.
Os dados de log foram coletados. Visão geral da ingestão de dados.
Um índice foi criado com o modo de varredura desativado.
Exemplos
Combinação com predicados SQL
Combine search() com predicados SQL usando AND para obter uma filtragem mais precisa.
-- 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
Apenas o operador AND pode conectar
search()a outros predicados SQL.É proibido usar
search()em qualquer expressão OR. Por exemplo,search('error') OR status = 500não é permitido.O uso de OR é permitido entre predicados SQL que não incluam
search(). Por exemplo,search('error') AND (status = 500 OR status = 502)é válido.
Cenários de JOIN com múltiplas tabelas
A função search() suporta JOINs entre vários LogStores. Cada subconsulta aplica seu próprio filtro search() de forma independente.
Cada subconsulta pode conter apenas uma chamada de search(). Um JOIN de múltiplas tabelas pode ter várias chamadas de search(), pois cada search() pertence a uma subconsulta diferente.
Dados de amostra
Os exemplos a seguir utilizam uma tabela de pedidos (LogStore orders) e uma tabela de usuários (LogStore users).
Esquema da tabela de pedidos (LogStore orders):
|
Nome do campo |
Tipo do campo |
Descrição |
|
order_id |
long |
ID do pedido |
|
user_id |
long |
ID do usuário, associado à tabela de usuários |
|
status |
text |
Status do pedido, como concluído, pendente ou cancelado |
|
amount |
double |
Valor do pedido |
|
order_type |
text |
Tipo de pedido, como normal ou vip |
Esquema da tabela de usuários (LogStore users):
|
Nome do campo |
Tipo do campo |
Descrição |
|
user_id |
long |
ID do usuário, chave primária |
|
username |
text |
Nome de usuário |
|
region |
text |
Região onde o usuário está localizado, como hangzhou, shanghai ou beijing |
|
|
text |
E-mail do usuário |
|
age |
long |
Idade do usuário |
INNER JOIN
Consulte pedidos concluídos (status = completed) com usuários correspondentes na região de 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
Retorne todos os pedidos concluídos e associe apenas usuários da região de shanghai. Pedidos sem um usuário correspondente exibirão null nos campos relacionados ao usuário.
* | 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
Em um self-join, aplique condições de busca diferentes às subconsultas com aliases distintos.
O exemplo abaixo usa uma tabela de funcionários (LogStore employees) com este esquema:
|
Nome do campo |
Tipo do campo |
Descrição |
|
employee_id |
long |
ID do funcionário |
|
employee_name |
text |
Nome do funcionário |
|
department |
text |
Departamento, como engineering ou finance |
|
level |
text |
Nível, como junior ou senior |
|
manager_id |
long |
O employee_id do gerente |
Consulte funcionários do departamento de engenharia juntamente com seus gerentes de nível sênior:
* | 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
Limites
|
Limite |
Descrição |
|
Limite por instância única |
Cada subconsulta pode conter apenas uma chamada de |
|
Limite do operador OR |
Não é possível combinar |
|
Limite do modo de varredura |
A função de busca não é suportada no modo de varredura. |
|
Conflito de entrada de sintaxe de consulta |
O uso de |
|
Tipo de parâmetro |
O parâmetro da função de busca deve ser uma string literal. Valores dinâmicos, como referências de colunas, variáveis ou expressões de função, não são suportados. |
Limites de uso combinado
|
Cenário |
Suportado |
Exemplo |
|
Função de busca única |
|
|
|
search + AND + condição SQL |
|
|
|
search + AND + (c1 OR c2) |
|
|
|
Operador OR usado dentro de search |
|
|
|
search em cada subconsulta de um JOIN de múltiplas tabelas |
|
Cada subconsulta opera independentemente, sem afetar as outras. |
|
Múltiplas funções search na mesma subconsulta |
|
Em vez disso, use |
|
search + OR + condição SQL |
|
|
Melhores práticas
Consolide as condições de consulta: Reúna todas as condições de busca de texto completo em uma única chamada de
search(). Múltiplas chamadas desearch()na mesma subconsulta não são suportadas.Prefira consultas específicas por campo: Utilize o formato
field: valueem vez de busca genérica de texto completo para melhorar a precisão e o desempenho.Aproveite tipos numéricos: Para campos long ou double, utilize consultas de intervalo (
field in [min max]) em vez de correspondência de texto.Especifique caminhos de subcampos para campos JSON: Defina um caminho preciso de subcampo, como
content.status, para evitar correspondências difusas no nível pai.Combine predicados SQL de forma eficaz: Use search() para filtragem de texto completo e predicados SQL para comparações numéricas. A combinação com AND garante tanto desempenho quanto flexibilidade.
Perguntas frequentes
Erro: key (xxx) is not config as key value config
O campo consultado não possui índice de campo. Verifique sua configuração de índice e crie um índice de campo para este campo específico.
Erro: Multiple search() functions in a single query are not supported
Existem múltiplas chamadas de search() na mesma subconsulta. Consolide-as em uma única chamada; por exemplo, altere search('error') AND search('timeout') para search('error AND timeout').
Erro: The search() function cannot be combined with OR operator
A função search() está conectada a outras condições via OR. Mova a lógica OR para dentro da função de busca. Por exemplo, altere search('error') OR status = 500 para search('error OR status: 500').
Erro: The search() function is not supported in scan mode
O modo de varredura não suporta search(). Mude para o modo de índice para utilizar esta função.