
kipin.pe vende pines metálicos ilustrados. El catálogo es pequeño y el carrito es lo de menos: lo que de verdad decide si la tienda sirve es si el cliente encuentra el pin que quiere cuando escribe su nombre a medias.
El buscador es el producto
En una tienda pequeña nadie navega por categorías: escribe. Y escribe mal, con prisa y desde el celular. "catus" por cactus, "ajolote" sin tilde, "puns" por pines.
Resolver eso con Django y PostgreSQL es más simple de lo que parece, porque la base de datos ya trae las herramientas:
pg_trgmpara comparar por similitud de trigramas, que tolera letras cambiadas y faltantes.unaccentpara que "biológico" y "biologico" sean lo mismo.TrigramSimilaritycon pesos distintos por campo: el nombre pesa más que la descripción, porque "cactus" en el título es una señal mucho más fuerte que "cactus" en un párrafo.
Para los productos relacionados uso la otra mitad de PostgreSQL: SearchVector y SearchRank con búsqueda de texto completo. Así una ficha de un pin de gato sugiere otros animales y no un pin de astronauta que comparte la palabra "bonito".
Miniaturas en WebP
Las fotos de producto llegan en JPG de varios cientos de kilobytes. easy-thumbnails genera los tamaños definidos en THUMBNAIL_ALIASES, y cada vez que crea una miniatura genera también su versión WebP. El navegador recibe la que soporta.
Es una optimización de una tarde que se nota en el celular, que es donde compra casi todo el mundo.
Lo demás de la tienda
- Catálogo con productos, etiquetas y categorías.
- Reseñas de clientes.
- Sitemap y
robots.txtgenerados por Django, no escritos a mano. - Un feed para Facebook que se regenera solo.
- Newsletter.
Despliegue
gunicorn en 127.0.0.1:8003 detrás de nginx, con systemd. Los estáticos los sirve nginx directamente desde el directorio de collectstatic; el media, desde el directorio de subidas. La aplicación no ve una petición de imagen en su vida.
Las dependencias van con uv y el uv.lock congelado en producción: el servidor instala exactamente lo que probé, no lo que resuelva pip ese día.
Los tests son de humo —páginas públicas, buscador, sitemap, feed y admin— contra PostgreSQL real, no contra SQLite. Un buscador con trigramas que se prueba en SQLite no se está probando.
Lo que aprendí
En una tienda pequeña, el buscador vale más que el diseño. El rediseño se nota una vez; una búsqueda que falla se nota en cada visita.
Las extensiones de PostgreSQL son la mejor dependencia que no tienes que instalar. pg_trgm y unaccent ya estaban ahí; el trabajo fue entenderlas, no añadir una librería de búsqueda.
Servir estáticos desde la aplicación es un impuesto que se paga en cada visita. Con nginx delante, no hay motivo.
Pruébalo
En kipin.pe. Y si el buscador no encuentra algo que debería, es un bug: escríbeme.
Más proyectos.
Comentarios !
comments powered by Disqus