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,28 +32,31 @@
</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>
{#each data.collapsedProductos as producto} {#if data.collapsedProductos.length === 0}
<a href={`/id_producto/${producto.id_producto}`} class="my-2 block"> <p class="my-2 text-gray-600">
<Card.Root class="transition-colors duration-200 hover:bg-gray-100"> No se encontraron resultados para "{data.query}". Tené en cuenta que actualmente, el algoritmo
<Card.Header class="block px-3 py-2 pb-0"> de búsqueda es muy básico. Probá buscando palabras clave como "alfajor", "ketchup" o
<Badge "lenteja".
>{Array.from(producto.marcas) </p>
.filter((m) => !['sin marca', 'VARIOS'].includes(m)) {:else}
.filter((m) => m?.trim().length > 0) {#each data.collapsedProductos as producto}
.join('/')}</Badge <a href={`/id_producto/${producto.id_producto}`} class="my-2 block">
> <Card.Root class="transition-colors duration-200 hover:bg-gray-100">
<Badge variant="outline">en {producto.in_datasets_count} cadenas</Badge> <Card.Header class="block px-3 py-2 pb-0">
<Badge variant="outline">EAN {producto.id_producto}</Badge> <Badge>{parseMarcas(Array.from(producto.marcas)).join('/')}</Badge>
</Card.Header> <Badge variant="outline">en {producto.in_datasets_count} cadenas</Badge>
<Card.Content class="px-3 py-2"> <Badge variant="outline">EAN {producto.id_producto}</Badge>
{#each producto.descriptions as description} </Card.Header>
<span>{description}</span> <Card.Content class="px-3 py-2">
{#if description !== producto.descriptions[producto.descriptions.length - 1]} {#each producto.descriptions as description}
<span class="text-gray-500"></span>{' '} <span>{description}</span>
{/if} {#if description !== producto.descriptions[producto.descriptions.length - 1]}
{/each} <span class="text-gray-500"></span>{' '}
</Card.Content> {/if}
</Card.Root> {/each}
</a> </Card.Content>
{/each} </Card.Root>
</a>
{/each}
{/if}
</div> </div>