Buscador interno de catálogo: holograma de una lupa ámbar que eleva y ordena cubos de luz sobre una cuadrícula infinita
Desarrollo WebSoftware / APIs

Buscador Interno para Webs y Catálogos: Cómo Elegirlo

Codezone
Codezone Empresa de Desarrollo Web y Software a Medida

Un buscador interno para tu web o catálogo puede vivir en la propia base de datos mientras las búsquedas sean sencillas y PostgreSQL ya forme parte del proyecto. Cuando necesitas tolerar erratas y ofrecer filtros por atributos con respuesta inmediata, compensa un motor dedicado como Meilisearch o Algolia. En Codezone lo resolvemos dentro de nuestros servicios de integración y mantenimiento.

Un buscador que no encuentra lo que el cliente escribe le manda a otra tienda o al teléfono. Y un `LIKE '%texto%'` con comodín inicial no puede usar un índice B-tree normal, así que recorre la tabla entera y, cuando el catálogo crece, frena también el resto de la web. Si vendes en varios idiomas, el índice se separa por idioma igual que en la arquitectura de una web multidioma para empresas.

Al terminar sabrás si te basta la base de datos o necesitas un motor aparte, y qué medir desde el primer día con la analítica de e-commerce aplicada a las búsquedas.

Qué Es un Buscador Interno

Un buscador interno es el sistema que recibe lo que el usuario escribe en la caja de búsqueda de tu web, lo compara con un índice de productos o contenidos y devuelve los resultados ordenados por relevancia, con filtros y sugerencias cuando el catálogo lo pide.

Holograma de un archivador de cristal con miles de fichas de luz naranja reordenándose en el aire
El índice es una copia del catálogo pensada solo para encontrar rápido.

LIKE o Búsqueda de Texto Completo en PostgreSQL

La búsqueda de texto completo de PostgreSQL cubre muchos catálogos medianos sin añadir infraestructura. Frente a `LIKE`, que compara cadenas literales, trabaja con un `tsvector` que reduce cada palabra a su raíz según el idioma, de modo que "tornillos" encuentra "tornillo".

Según la documentación oficial de búsqueda de texto en PostgreSQL, el `tsvector` puede guardarse en una columna generada que se actualiza sola, con un índice GIN encima. La función `websearch_to_tsquery` acepta el texto tal como lo escribe el usuario y nunca lanza errores de sintaxis. Para erratas está la extensión `pg_trgm`, que compara trigramas y también acelera `LIKE` e `ILIKE`.

Mantener `LIKE` con un catálogo que crece acumula deuda técnica en el buscador del catálogo.

Cuándo Pasar a un Motor Dedicado

Un motor dedicado compensa cuando la búsqueda es parte central de la venta y necesitas resultados mientras el usuario teclea. Así se reparten las opciones:

  • PostgreSQL full-text: Coste extra: ninguno. Erratas: con `pg_trgm`. Facetas: con consultas propias. Encaja: catálogos que ya viven en PostgreSQL.
  • Meilisearch: Erratas: activas por defecto, una desde 5 caracteres y dos desde 9, según su documentación de tolerancia a errores. Facetas: declarando `filterableAttributes`. Encaja: búsqueda instantánea sin operar un clúster.
  • Algolia: Servicio gestionado con tolerancia a erratas de serie y un panel con la tasa de búsquedas sin resultados. Encaja: equipos sin tiempo para mantener servidores.
  • Elasticsearch u OpenSearch: Erratas: parámetro `fuzziness` por consulta. Sinónimos de varias palabras con el filtro `synonym_graph`. Encaja: volúmenes grandes y equipos capaces de operar el clúster.

Quédate en la base de datos si la mayoría de búsquedas son por referencia o nombre exacto. Pasa a un motor si tus clientes buscan por descripción o cometen erratas a menudo.

Holograma de un motor de engranajes de luz ámbar girando dentro de una esfera de cristal sobre suelo reflectante
Un motor dedicado añade una pieza más que vigilar en producción.

Relevancia, Sinónimos y Facetas

La relevancia de un buscador interno se define con reglas de negocio que alguien tiene que decidir. Una coincidencia exacta de referencia va primero y el nombre pesa más que la descripción. El producto agotado puede bajar posiciones.

Si tu tienda corre sobre Shopify, revisa antes los límites técnicos de Shopify en catálogos grandes.

Sincronización y Búsquedas sin Resultados

Un motor externo es una copia del catálogo, así que necesita sincronizarse cada vez que el ERP cambia un precio o un stock. Envía cada cambio por eventos y programa una reindexación completa nocturna como red de seguridad, siguiendo el flujo para conectar el ERP con el e-commerce.

Registra cada búsqueda que devuelve cero resultados. Esa lista te dice qué sinónimos faltan y qué productos piden tus clientes que no tienes. La caja de búsqueda también debe manejarse con teclado y anunciar los resultados, uno de los criterios de la accesibilidad obligatoria en formularios.

Holograma del elefante de PostgreSQL formado por malla de luz naranja sobre columnas de datos que suben y bajan
Con índice GIN y ranking, la base de datos responde sin servicios extra.
CodeZone Pro Tip: monta búsqueda de texto completo con ranking y rescate de erratas en PostgreSQL, sin añadir otro servicio a tu infraestructura.
-- Columna generada: se recalcula en cada INSERT/UPDATE sin triggers que mantener
ALTER TABLE productos ADD COLUMN busqueda tsvector GENERATED ALWAYS AS (
  setweight(to_tsvector('spanish', coalesce(nombre, '')), 'A') ||
  setweight(to_tsvector('spanish', coalesce(referencia, '')), 'A') ||
  setweight(to_tsvector('spanish', coalesce(descripcion, '')), 'C')
) STORED;

-- GIN sobre el tsvector: evita el recorrido completo que provoca LIKE '%texto%'
CREATE INDEX productos_busqueda_idx ON productos USING GIN (busqueda);

-- Trigramas sobre el nombre para rescatar búsquedas con erratas
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX productos_nombre_trgm_idx ON productos USING GIN (nombre gin_trgm_ops);

-- Búsqueda principal: el texto del usuario entra tal cual, sin errores de sintaxis
PREPARE buscar(text) AS
  SELECT id, nombre, ts_rank(busqueda, q) AS relevancia
  FROM productos, websearch_to_tsquery('spanish', $1) AS q
  WHERE busqueda @@ q AND activo
  ORDER BY relevancia DESC
  LIMIT 20;

-- Plan B si la anterior devuelve cero filas: similitud por trigramas
PREPARE buscar_parecidos(text) AS
  SELECT id, nombre, similarity(nombre, $1) AS parecido
  FROM productos
  WHERE activo AND nombre % $1
  ORDER BY parecido DESC
  LIMIT 10;

Con esto tu catálogo ordena por relevancia y ofrece alternativas cuando el cliente escribe mal. Pospones la decisión de pagar un motor externo hasta que los datos de búsqueda la justifiquen.

Lo Que Pierdes con Cada Búsqueda sin Resultados

Cada búsqueda sin resultados es una intención de compra que no llega al carrito. Elegir mal el motor sale caro en ambas direcciones: un servicio externo sin necesidad suma coste y sincronización, y quedarse en `LIKE` deja ventas en la caja de búsqueda.

Holograma de un carrito de compra de malla naranja vacío frente a un embudo de luz roja que se apaga
Las búsquedas fallidas son una lista de pedidos que todavía no atiendes.

Mide primero qué buscan tus clientes y elige el motor con esos datos.

Si tu buscador no encuentra lo que vendes o quieres saber si te basta PostgreSQL, cuéntanos cómo es tu catálogo.