mejorar búsqueda

This commit is contained in:
Cat /dev/Nulo 2024-09-14 17:23:33 -03:00
parent b05776a736
commit 245dc2eb02
2 changed files with 48 additions and 28 deletions

View file

@ -16,11 +16,17 @@ export const load: PageServerLoad = async ({ params }) => {
// // 'datasets.id_comercio = latest_datasets.id_comercio AND datasets.date = latest_datasets.max_date' // // 'datasets.id_comercio = latest_datasets.id_comercio AND datasets.date = latest_datasets.max_date'
// )) // ))
const query = params.query; const query = params.query
.replaceAll(/á/giu, 'a')
.replaceAll(/é/giu, 'e')
.replaceAll(/í/giu, 'i')
.replaceAll(/ó/giu, 'o')
.replaceAll(/ú/giu, 'u')
.replaceAll(/ñ/giu, 'n');
const productos = await db.execute<{ const productos = await db.execute<{
id_producto: string; id_producto: string;
productos_descripcion: string; productos_descripcion: string;
productos_marca: string; productos_marca: string | null;
in_datasets_count: number; in_datasets_count: number;
}>(sql` }>(sql`
SELECT id_producto, productos_descripcion, productos_marca, SELECT id_producto, productos_descripcion, productos_marca,
@ -46,7 +52,7 @@ WHERE p.id_producto = index.id_producto) as in_datasets_count
const existingProduct = acc.find((p) => p.id_producto === producto.id_producto); const existingProduct = acc.find((p) => p.id_producto === producto.id_producto);
if (existingProduct) { if (existingProduct) {
existingProduct.descriptions.push(producto.productos_descripcion); existingProduct.descriptions.push(producto.productos_descripcion);
existingProduct.marcas.add(producto.productos_marca); if (producto.productos_marca) existingProduct.marcas.add(producto.productos_marca);
existingProduct.in_datasets_count = Math.max( existingProduct.in_datasets_count = Math.max(
existingProduct.in_datasets_count, existingProduct.in_datasets_count,
producto.in_datasets_count producto.in_datasets_count
@ -55,7 +61,7 @@ WHERE p.id_producto = index.id_producto) as in_datasets_count
acc.push({ acc.push({
id_producto: producto.id_producto, id_producto: producto.id_producto,
descriptions: [producto.productos_descripcion], descriptions: [producto.productos_descripcion],
marcas: new Set([producto.productos_marca]), marcas: new Set(producto.productos_marca ? [producto.productos_marca] : []),
in_datasets_count: producto.in_datasets_count in_datasets_count: producto.in_datasets_count
}); });
} }

View file

@ -8,6 +8,17 @@
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
export let data: PageData; export let data: PageData;
function parseMarcas(marcas: readonly string[]) {
const x = marcas
.map((m) => m.trim().replaceAll(/['`´]/g, ''))
.filter((m) => !['sin marca', 'VARIOS'].includes(m))
.filter((m) => m.length > 0);
if (x.length === 0) {
return ['n/a'];
}
return Array.from(new Set(x));
}
</script> </script>
<svelte:head> <svelte:head>
@ -21,16 +32,18 @@
</Button> </Button>
<SearchBar /> <SearchBar />
<h1 class="my-2 text-2xl font-bold">Resultados para "{data.query}"</h1> <h1 class="my-2 text-2xl font-bold">Resultados para "{data.query}"</h1>
{#if data.collapsedProductos.length === 0}
<p class="my-2 text-gray-600">
No se encontraron resultados para "{data.query}". Tené en cuenta que actualmente, el algoritmo
de búsqueda es muy básico. Probá buscando palabras clave como "alfajor", "ketchup" o
"lenteja".
</p>
{:else}
{#each data.collapsedProductos as producto} {#each data.collapsedProductos as producto}
<a href={`/id_producto/${producto.id_producto}`} class="my-2 block"> <a href={`/id_producto/${producto.id_producto}`} class="my-2 block">
<Card.Root class="transition-colors duration-200 hover:bg-gray-100"> <Card.Root class="transition-colors duration-200 hover:bg-gray-100">
<Card.Header class="block px-3 py-2 pb-0"> <Card.Header class="block px-3 py-2 pb-0">
<Badge <Badge>{parseMarcas(Array.from(producto.marcas)).join('/')}</Badge>
>{Array.from(producto.marcas)
.filter((m) => !['sin marca', 'VARIOS'].includes(m))
.filter((m) => m?.trim().length > 0)
.join('/')}</Badge
>
<Badge variant="outline">en {producto.in_datasets_count} cadenas</Badge> <Badge variant="outline">en {producto.in_datasets_count} cadenas</Badge>
<Badge variant="outline">EAN {producto.id_producto}</Badge> <Badge variant="outline">EAN {producto.id_producto}</Badge>
</Card.Header> </Card.Header>
@ -45,4 +58,5 @@
</Card.Root> </Card.Root>
</a> </a>
{/each} {/each}
{/if}
</div> </div>