DanLevy.net

Ola de innovación en bases de datos de 2025

Gracias a la IA.

No es otro artículo sobre bases de datos vectoriales

Aquí está la regla de decisión que desearía haber usado antes:

Si tus datos pueden reconstruirse desde archivos y los usuarios los leen principalmente, prueba una base de datos de almacenamiento en objetos primero. Si los usuarios la escriben todo el día, empieza con una base de datos real y deja de intentar hacer que S3 haga de cuenta.

Esa es la línea útil. No “el sin servidor es el futuro”. No “las bases de datos vectoriales cambiaron todo”. Esas frases ya han sido impresas en suficientes cintas de conferencia.

La IA sí cambió la forma de muchos problemas de búsqueda. De repente, equipos pequeños querían búsqueda semántica, clasificación híbrida, chat de documentos, búsqueda multimodal y análisis sobre archivos almacenados en almacenamiento de objetos. La respuesta anterior era “ejecutar Postgres con pgvector” o “operar OpenSearch/Elasticsearch” o “comprar un servicio de búsqueda gestionado”. Esas siguen siendo buenas respuestas cuando la carga de trabajo lo merece.

Pero muchas cargas de trabajo no lo hacen. Son de lectura intensiva, reconstruibles y tolerantes a un breve retraso entre el cambio de contenido y la actualización de la búsqueda. Documentación. Instantáneas de catálogos. Exportaciones estáticas. Bases de conocimiento internas. Análisis local. Sistemas prototipo de RAG. Para esas, una nueva clase de herramientas ha hecho que la arquitectura sencilla sea inusualmente poderosa: construye un índice, almacénalo como archivos y súpelo a través de HTTP.

Nota de captura: el ecosistema evoluciona rápidamente. Los contadores de estrellas, etiquetas de características y cifras de rendimiento que aparecen a continuación son una captura de septiembre de 2025, no un ranking inmutable. Trátelos como orientación, y consulte la documentación actual antes de apostar por la migración a producción basada en cualquier celda específica.

Una base de datos por cualquier otro nombre

Estos almacenes de datos sin servidor y capaces de CDN son útiles para casos de tamaño intermedio, aproximadamente entre 1.000 y 1.000.000 de registros o unos pocos gigabytes, donde la infraestructura tradicional de bases de datos puede ser más ceremonia que valor:

El movimiento común es simple: mantenga los datos persistentes en archivos o almacenamiento de objetos, y consulte desde un navegador, función de borde, trabajador o servicio ligero. Eso no elimina la complejidad. Mueve la complejidad a las tuberías de construcción, frescura de índices, invalidación de caché y capacidades del cliente. Lo cual es un intercambio perfectamente válido cuando las lecturas dominan.

Batalla de las casillas de verificación

Batalla de las casillas de verificación

CaracterísticaPagefindOramaChromaLanceDBDuckDB-WASM
Búsqueda de texto completo✅ Stemming avanzado✅ BM25, 30 idiomas✅ FTS de SQLite✅ Tantivy✅ SQL completo
Búsqueda de vectores✅ Similitud coseno✅ HNSW✅ IVF_PQ, HNSW, GPU⚠️ Extensiones
Integraciones de IA/RAGNinguna✅ Pipeline integrado✅ LangChain, LlamaIndex✅ Reordenamiento avanzado⚠️ Configuración manual
AlmacenamientoJSON/WASM estáticoMemoria + plugins S3Basado en servidor*Lance compatible con S3WASM + S3/HTTP
Soporte de escrituraSolo en tiempo de construcciónCRUD completoCRUD completoCRUD completoCRUD SQL completo
RendimientoSub-100ms0.0001ms - 100msSub-100ms3-5ms vector, 50ms FTS10ms-1s (SQL complejo)

*Instantánea de septiembre de 2025: Chroma requiere un entorno de ejecución de servidor y no soporta almacenamiento directo en S3 de la manera que lo hacen las herramientas de archivos-objeto (problema #1736).

Ejemplos de implementación

Las diferencias sintácticas revelan la división real: la búsqueda en tiempo de construcción, la búsqueda en memoria, el almacenamiento nativo de vectores, las tablas multimodales y el SQL en el navegador no son la misma categoría de producto solo porque todos aparezcan en demos de IA.

Búsqueda en sitio estático con Pagefind

<link href="../pagefind/pagefind-ui.css" rel="stylesheet">
<script src="../pagefind/pagefind-ui.js"></script>
<div id="search"></div>
<script>new PagefindUI({ element: "#search" });</script>

Multimodal empresarial con LanceDB

Código para crear una tabla LanceDB con embeddings automáticos de OpenAI:

import * as lancedb from "@lancedb/lancedb";
import "@lancedb/lancedb/embedding/openai";
import { LanceSchema, getRegistry } from "@lancedb/lancedb/embedding";
import { Utf8 } from "apache-arrow";
const db = await lancedb.connect("data/multimodal-db");
const func = getRegistry()
.get("openai")
?.create({ model: "text-embedding-ada-002" });
// Esquema con generación automática de embeddings
const documentsSchema = LanceSchema({
text: func.sourceField(new Utf8()),
vector: func.vectorField(),
category: new Utf8()
});
const table = await db.createEmptyTable("documents", documentsSchema);
await table.add([
{ text: "machine learning concepts", category: "research" },
{ text: "deep learning fundamentals", category: "research" }
]);

Ejemplo de consulta a una tabla LanceDB:

import * as lancedb from "@lancedb/lancedb";
import "@lancedb/lancedb/embedding/openai";
// "Conectar" a una ruta URL
const db = await lancedb.connect("data/multimodal-db");
const table = db.getTable("documents");
// Combinación de SQL y búsqueda vectorial
const results = await table.search("machine learning concepts")
.where("category = 'research'")
.limit(10)
.toArray();
console.log(results);

Búsqueda universal con Orama

import { create, insert, search } from '@orama/orama'
const db = create({
schema: {
title: 'string',
content: 'string',
embedding: 'vector[1536]'
}
})
await insert(db, {
title: 'Getting Started',
content: 'Learn the basics',
embedding: await generateEmbedding('Learn the basics')
})
const results = await search(db, {
term: 'basics',
mode: 'hybrid' // Combina búsqueda de texto y vectorial
})

DuckDB-WASM:

import * as duckdb from "https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@latest/dist/duckdb-browser.mjs";
const bundle = await duckdb.selectBundle(duckdb.getJsDelivrBundles());
const worker = new Worker(bundle.mainWorker);
const db = new duckdb.AsyncDuckDB(new duckdb.ConsoleLogger(), worker);
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
const conn = await db.connect();
await conn.query(`create table t as select * from (values (1,'hybrid search'),(2,'edge sql')) as v(id,txt);`);
// Búsqueda de texto completo opcional:
await conn.query(`install fts; load fts; select * from t where match_bm25(txt, 'hybrid');`);

Búsqueda nativa de IA con Chroma

import { ChromaClient } from "chromadb";
const client = new ChromaClient();
const collection = await client.createCollection({ name: "knowledge-base" });
await collection.add({
documents: ["AI will transform software development"],
metadatas: [{ source: "tech-blog", category: "AI" }],
ids: ["doc1"]
});
const results = await collection.query({
queryTexts: ["future of programming"],
where: { category: "AI" },
nResults: 5
});

Guía de casos de uso

Elige Pagefind cuando:

Elige Orama cuando:

Elige Chroma cuando:

Elige LanceDB cuando:

Elige DuckDB-WASM cuando:

La regla de decisión

La pregunta práctica no es “¿cuál base de datos es mejor?”

La pregunta práctica es: ¿qué tipo de cambio debe absorber el sistema?

El camino feliz es barato. Los casos extremos deciden la arquitectura.

El cuadro más amplio

Estas herramientas reducen la infraestructura mínima viable para una búsqueda útil. Eso importa. En 2020, “búsqueda semántica” implicaba a menudo una pila de servicios, mucho código de unión y a alguien explicando índices vectoriales en una reunión donde la mitad quería almorzar. En 2025, un equipo pequeño puede prototipar la misma idea de producto con archivos, embeddings y un fin de semana.

Eso no significa que cada caja de búsqueda deba convertirse en un sistema RAG. Significa que la primera versión no tiene que heredar infraestructura de producción antes de tener evidencia de producción.

Incluso AWS ha estado moviéndose en esta dirección con su trabajo de búsqueda vectorial asociado a S3, lo cual es una señal útil: el almacenamiento de objetos ya no es solo el sótano donde van los archivos viejos. Se está convirtiendo en una superficie de consulta.

Comienza a experimentar

  1. Elige el patrón de actualización primero: tiempo de construcción, lote horario, escrituras en vivo o resultados por usuario.
  2. Prototipa con la herramienta más honesta y pequeña: Pagefind para HTML estático, DuckDB para archivos analíticos, Orama para búsqueda en aplicaciones ligeras, LanceDB o Chroma para cargas vectoriales intensivas.
  3. Mide la parte fea: tiempo de indexación, frescura, tamaño de paquete, permisos y la primera consulta tras un inicio frío.
  4. Promueve solo cuando el dolor sea real: una base de datos gestionada es más fácil de justificar después de que la versión basada en archivos muestre exactamente dónde se dobla.

Consulta mi guía práctica de Pagefind para implementación concreta, o explora el creciente ecosistema de bases de datos nativas de edge que redefinen el manejo de datos a gran escala.

Aviso legal: He utilizado Pagefind durante años y me convertí en colaborador en 2025. He experimentado con Orama y Chroma para proyectos más pequeños y estoy explorando LanceDB para aplicaciones de IA más grandes. No tengo intereses financieros en estos proyectos, solo interés en la evolución del paisaje de bases de datos.