Quickwit - Motor de búsqueda nativo en la nube para registros
Quickwit es un motor de búsqueda de código abierto basado en Rust diseñado para datos de solo-adición — registros, trazas y eventos de auditoría — que se ejecuta directamente en almacenamiento de objetos (S3, GCS, Azure). A diferencia de Elasticsearch, no necesita disco local ni maquinaria de estado de clúster para índices, que desacopla almacenamiento de cómputo y hace retención a escala de petabytes económica. Expone una API de búsqueda compatible con Elasticsearch y es un backend nativo de Jaeger para trazas.
Instalación
| Método | Comando |
|---|
| Script de instalación | `curl -L https://install.quickwit.io |
| Docker | docker run -p 7280:7280 quickwit/quickwit run |
| Kubernetes | Gráfico Helm disponible |
| Inicia un nodo | ./quickwit run |
| UI / API | http://localhost:7280 |
Conceptos principales
| Término | Significado |
|---|
| Índice | Un conjunto de datos nombrado con asignación de documentos |
| División | Un fragmento indexado inmutable almacenado en almacenamiento de objetos |
| Metatienda | Rastrea índices/divisiones (archivo o PostgreSQL) |
| Fuente | De dónde vienen los documentos (Kafka, archivo, API de ingesta) |
| Roles de nodo | indexador, buscador, metatienda, plano de control |
Creación de un índice
# index-config.yaml
version: 0.8
index_id: app-logs
doc_mapping:
field_mappings:
- name: timestamp
type: datetime
fast: true
input_formats: [rfc3339, unix_timestamp]
- name: level
type: text
tokenizer: raw
- name: service
type: text
tokenizer: raw
- name: message
type: text
tokenizer: default
timestamp_field: timestamp
indexing_settings:
commit_timeout_secs: 30
search_settings:
default_search_fields: [message]
quickwit index create --index-config index-config.yaml
Ingesta de datos
| Método | Comando |
|---|
| Archivo | quickwit index ingest --index app-logs --input-path logs.json |
| Stdin | `cat logs.json |
| API de ingesta | POST /api/v1/app-logs/ingest |
| Fuente de Kafka | Define una fuente en la configuración de índice |
| OTLP | Punto final nativo de OpenTelemetry para registros/trazas |
curl -XPOST "http://localhost:7280/api/v1/app-logs/ingest" \
--data-binary @logs.ndjson
Búsqueda
# Búsqueda CLI
quickwit index search --index app-logs --query "level:ERROR AND service:api"
# Búsqueda REST
curl "http://localhost:7280/api/v1/app-logs/search?query=level:ERROR&max_hits=20"
| Sintaxis de consulta | Coincide |
|---|
term | Término de texto completo en campos por defecto |
field:value | Coincidencia exacta de campo |
a AND b, a OR b, NOT a | Lógica booleana |
field:[10 TO 100] | Rango |
"exact phrase" | Coincidencia de frase |
field:prefix* | Coincidencia de prefijo |
Agregaciones y filtros de tiempo
# Búsqueda acotada en tiempo (usa el campo de timestamp rápido)
curl "http://localhost:7280/api/v1/app-logs/search?query=*&start_timestamp=1753400000&end_timestamp=1753486400"
Quickwit admite agregaciones de estilo Elasticsearch, así que consultas y paneles existentes a menudo se portan con poco cambio.
Gestión de índices
| Comando | Descripción |
|---|
quickwit index list | Lista índices |
quickwit index describe --index X | Muestra estadísticas/divisiones |
quickwit index clear --index X | Elimina todos los documentos |
quickwit index delete --index X | Elimina el índice |
quickwit split list --index X | Inspecciona divisiones |
Retención
retention:
period: 90 days
schedule: daily
Porque las divisiones viven en almacenamiento de objetos, la retención es solo eliminar divisiones antiguas — barato y rápido.
Integraciones
| Objetivo | Nota |
|---|
| Jaeger | Quickwit es un backend nativo de almacenamiento de Jaeger |
| Grafana | Complemento de fuente de datos para paneles |
| OpenTelemetry | Ingesta nativa de OTLP para registros y trazas |
| API de Elasticsearch | Puntos finales de búsqueda compatibles facilitan la migración |
Quickwit vs alternativas
| Aspecto | Quickwit | Elasticsearch | Loki |
|---|
| Almacenamiento | Solo almacenamiento de objetos | Disco local | Almacenamiento de objetos |
| Índice de texto completo | Sí (búsqueda verdadera) | Sí | Basada en etiqueta, limitada |
| Costo a escala | Muy bajo | Alto | Bajo |
| Trazas | Backend nativo de Jaeger | Complementos APM | Vía Tempo |
| Mejor para | Retención barata y buscable de registro/traza | Búsqueda general | Registros nativos de Grafana |
Compara con Loki y OpenObserve; empareja con Vector para ingesta.
Recursos