Pular para o conteúdo principal

Busca no ClickStack e no Elastic

O ClickHouse é um engine com SQL nativo, projetado desde o início para cargas de trabalho analíticas de alto desempenho. Em contraste, o Elasticsearch fornece uma interface semelhante a SQL, convertendo SQL para a query DSL subjacente do Elasticsearch — o que significa que ela não é uma funcionalidade nativa, e a paridade de recursos é limitada. O ClickHouse não apenas oferece suporte completo a SQL, como também o estende com uma variedade de funções voltadas para observabilidade, como argMax, histogram e quantileTiming, que simplificam consultas em logs, métricas e traces estruturados. Para exploração simples de logs e traces, a UI do ClickStack (HyperDX) fornece uma sintaxe no estilo Lucene para filtragem textual intuitiva de consultas por campo-valor, intervalos, curingas e muito mais. Isso é comparável à sintaxe Lucene no Elasticsearch e a elementos da Kibana Query Language. A interface de busca oferece suporte a essa sintaxe familiar, mas a traduz nos bastidores em cláusulas SQL WHERE eficientes, tornando a experiência familiar para usuários do Kibana e, ao mesmo tempo, permitindo aproveitar o poder do SQL quando necessário. Isso permite que você explore toda a gama de funções de busca em strings, funções de similaridade e funções de data e hora no ClickHouse. Abaixo, comparamos as linguagens de consulta Lucene do ClickStack e do Elasticsearch.

Sintaxe de busca do ClickStack vs. query string do Elasticsearch

Tanto o ClickStack quanto o Elasticsearch oferecem linguagens de consulta flexíveis para permitir uma filtragem intuitiva de logs e traces. Enquanto a query string do Elasticsearch é fortemente integrada ao seu DSL e mecanismo de indexação, o ClickStack oferece uma sintaxe inspirada no Lucene que é traduzida em ClickHouse SQL nos bastidores. A tabela abaixo mostra como padrões de busca comuns se comportam nos dois sistemas, destacando semelhanças de sintaxe e diferenças na execução no backend.
RecursoSintaxe do ClickStackSintaxe do ElasticsearchComentários
Busca de texto livreerrorerrorFaz correspondência em todos os campos indexados; no ClickStack, isso é reescrito como um SQL ILIKE em vários campos.
Correspondência de campolevel:errorlevel:errorSintaxe idêntica. No ClickStack, a correspondência é feita com valores exatos do campo no ClickHouse.
Busca por frase"disk full""disk full"O texto entre aspas corresponde a uma sequência exata; o ClickHouse usa igualdade de string ou ILIKE.
Correspondência de frase em campomessage:"disk full"message:"disk full"É traduzido para SQL ILIKE ou correspondência exata.
Condições ORerror OR warningerror OR warningOU lógico entre termos; ambos os sistemas oferecem suporte nativo a isso.
Condições ANDerror AND dberror AND dbAmbos são traduzidos para interseção; não há diferença na sintaxe para o usuário.
NegaçãoNOT error or -errorNOT error or -errorSuportado da mesma forma; o ClickStack converte para SQL NOT ILIKE.
Agrupamento(error OR fail) AND db(error OR fail) AND dbAgrupamento booleano padrão em ambos.
Wildcardserror* or *fail*error*, *fail*O ClickStack oferece suporte a wildcards no início/fim; o ES desabilita wildcards iniciais por padrão por questões de desempenho. Wildcards dentro de termos não são suportados, por exemplo, f*ail. Os wildcards devem ser aplicados com uma correspondência de campo.
Intervalos (numérico/data)duration:[100 TO 200]duration:[100 TO 200]O ClickStack usa SQL BETWEEN; o Elasticsearch expande para consultas de intervalo. * sem limite em intervalos não é suportado, por exemplo, duration:[100 TO *]. Se necessário, use Unbounded ranges abaixo.
Intervalos sem limite (numérico/data)duration:>10 or duration:>=10duration:>10 or duration:>=10O ClickStack usa operadores SQL padrão
Inclusivo/exclusivoduration:{100 TO 200} (exclusive)Same{} indica limites exclusivos. * em intervalos não é suportado, por exemplo, duration:[100 TO *]
Verificação de existênciaN/A_exists_:user or field:*_exists_ não é suportado. Use LogAttributes.log.file.path: * para colunas Map, por exemplo, LogAttributes. Para colunas raiz, elas precisam existir e terão um valor padrão se não forem incluídas no evento. Para buscar valores padrão ou colunas ausentes, use a mesma sintaxe do Elasticsearch: ServiceName:* ou ServiceName != ''.
Regexfunção matchname:/joh?n(ath[oa]n)/Atualmente não é suportado na sintaxe Lucene. Você pode usar SQL e a função match ou outras funções de busca de string.
Correspondência difusaeditDistance('quikc', field) = 1quikc~Atualmente não é suportado na sintaxe Lucene. As funções de distância podem ser usadas em SQL, por exemplo, editDistance('rror', SeverityText) = 1, ou outras funções de similaridade.
Busca por proximidadeNão suportado"fox quick"~5Atualmente não é suportado na sintaxe Lucene.
Boostingquick^2 foxquick^2 foxNão é suportado no ClickStack no momento.
Wildcard de camposervice.*:errorservice.*:errorNão é suportado no ClickStack no momento.
Caracteres especiais com escapeEscape reserved characters with \SameEscape obrigatório para símbolos reservados.

Diferenças entre existência/ausência

Diferentemente do Elasticsearch, em que um campo pode ser totalmente omitido de um evento e, portanto, realmente “não existir”, o ClickHouse exige que todas as colunas em um esquema de tabela existam. Se um campo não for fornecido em um evento de inserção:
  • Para campos Nullable, ele será definido como NULL.
  • Para campos não anuláveis (o padrão), ele será preenchido com um valor padrão (geralmente uma string vazia, 0 ou equivalente).
No ClickStack, usamos a segunda opção, já que Nullable não é recomendado. Esse comportamento significa que verificar se um campo “existe” no sentido do Elasticsearch não tem suporte direto. Em vez disso, você pode usar field:* ou field != '' para verificar a presença de um valor não vazio. Assim, não é possível distinguir entre campos realmente ausentes e campos explicitamente vazios. Na prática, essa diferença raramente causa problemas em casos de uso de observabilidade, mas é importante tê-la em mente ao traduzir consultas entre sistemas.
Última modificação em 10 de junho de 2026