mirror of
https://github.com/catdevnull/preciazo.git
synced 2024-11-25 19:16:19 +00:00
fts con postgres
This commit is contained in:
parent
841a1412a1
commit
5830cca9c5
5 changed files with 469 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
||||||
import { max, relations } from "drizzle-orm";
|
import { max, relations, sql } from "drizzle-orm";
|
||||||
import {
|
import {
|
||||||
pgTable,
|
pgTable,
|
||||||
integer,
|
integer,
|
||||||
|
@ -179,5 +179,11 @@ export const productos_descripcion_index = pgTable(
|
||||||
id_producto: bigint("id_producto", { mode: "bigint" }),
|
id_producto: bigint("id_producto", { mode: "bigint" }),
|
||||||
productos_descripcion: text("productos_descripcion").unique(),
|
productos_descripcion: text("productos_descripcion").unique(),
|
||||||
productos_marca: text("productos_marca"),
|
productos_marca: text("productos_marca"),
|
||||||
}
|
},
|
||||||
|
(table) => ({
|
||||||
|
// https://orm.drizzle.team/learn/guides/postgresql-full-text-search
|
||||||
|
tableSearchIndex: index(
|
||||||
|
"productos_descripcion_index_search_descripcion"
|
||||||
|
).using("gin", sql`to_tsvector('spanish', ${table.productos_descripcion})`),
|
||||||
|
})
|
||||||
);
|
);
|
||||||
|
|
1
sepa/drizzle/0004_mushy_ultragirl.sql
Normal file
1
sepa/drizzle/0004_mushy_ultragirl.sql
Normal file
|
@ -0,0 +1 @@
|
||||||
|
CREATE INDEX IF NOT EXISTS "productos_descripcion_index_search_descripcion" ON "productos_descripcion_index" USING gin (to_tsvector('spanish', "productos_descripcion"));
|
446
sepa/drizzle/meta/0004_snapshot.json
Normal file
446
sepa/drizzle/meta/0004_snapshot.json
Normal file
|
@ -0,0 +1,446 @@
|
||||||
|
{
|
||||||
|
"id": "36a04e5e-b070-4b89-96ce-e9431c2f199b",
|
||||||
|
"prevId": "7ea9c123-4d12-4f0b-9452-e8952462fbf8",
|
||||||
|
"version": "7",
|
||||||
|
"dialect": "postgresql",
|
||||||
|
"tables": {
|
||||||
|
"public.datasets": {
|
||||||
|
"name": "datasets",
|
||||||
|
"schema": "",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "serial",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"date": {
|
||||||
|
"name": "date",
|
||||||
|
"type": "date",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_comercio": {
|
||||||
|
"name": "id_comercio",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {
|
||||||
|
"datasets_name_key": {
|
||||||
|
"name": "datasets_name_key",
|
||||||
|
"nullsNotDistinct": false,
|
||||||
|
"columns": [
|
||||||
|
"name"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"public.precios": {
|
||||||
|
"name": "precios",
|
||||||
|
"schema": "",
|
||||||
|
"columns": {
|
||||||
|
"id_dataset": {
|
||||||
|
"name": "id_dataset",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_comercio": {
|
||||||
|
"name": "id_comercio",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_bandera": {
|
||||||
|
"name": "id_bandera",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_sucursal": {
|
||||||
|
"name": "id_sucursal",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_producto": {
|
||||||
|
"name": "id_producto",
|
||||||
|
"type": "bigint",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_ean": {
|
||||||
|
"name": "productos_ean",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_descripcion": {
|
||||||
|
"name": "productos_descripcion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_cantidad_presentacion": {
|
||||||
|
"name": "productos_cantidad_presentacion",
|
||||||
|
"type": "numeric(10, 2)",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_unidad_medida_presentacion": {
|
||||||
|
"name": "productos_unidad_medida_presentacion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_marca": {
|
||||||
|
"name": "productos_marca",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_precio_lista": {
|
||||||
|
"name": "productos_precio_lista",
|
||||||
|
"type": "numeric(10, 2)",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_precio_referencia": {
|
||||||
|
"name": "productos_precio_referencia",
|
||||||
|
"type": "numeric(10, 2)",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_cantidad_referencia": {
|
||||||
|
"name": "productos_cantidad_referencia",
|
||||||
|
"type": "numeric(10, 2)",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_unidad_medida_referencia": {
|
||||||
|
"name": "productos_unidad_medida_referencia",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_precio_unitario_promo1": {
|
||||||
|
"name": "productos_precio_unitario_promo1",
|
||||||
|
"type": "numeric(10, 2)",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_leyenda_promo1": {
|
||||||
|
"name": "productos_leyenda_promo1",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_precio_unitario_promo2": {
|
||||||
|
"name": "productos_precio_unitario_promo2",
|
||||||
|
"type": "numeric(10, 2)",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_leyenda_promo2": {
|
||||||
|
"name": "productos_leyenda_promo2",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"idx_precios_id_producto": {
|
||||||
|
"name": "idx_precios_id_producto",
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"expression": "id_producto",
|
||||||
|
"isExpression": false,
|
||||||
|
"asc": true,
|
||||||
|
"nulls": "last"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isUnique": false,
|
||||||
|
"concurrently": false,
|
||||||
|
"method": "btree",
|
||||||
|
"with": {}
|
||||||
|
},
|
||||||
|
"idx_precios_id_producto_id_dataset": {
|
||||||
|
"name": "idx_precios_id_producto_id_dataset",
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"expression": "id_producto",
|
||||||
|
"isExpression": false,
|
||||||
|
"asc": true,
|
||||||
|
"nulls": "last"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"expression": "id_dataset",
|
||||||
|
"isExpression": false,
|
||||||
|
"asc": true,
|
||||||
|
"nulls": "last"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isUnique": false,
|
||||||
|
"concurrently": false,
|
||||||
|
"method": "btree",
|
||||||
|
"with": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {
|
||||||
|
"precios_id_dataset_datasets_id_fk": {
|
||||||
|
"name": "precios_id_dataset_datasets_id_fk",
|
||||||
|
"tableFrom": "precios",
|
||||||
|
"tableTo": "datasets",
|
||||||
|
"columnsFrom": [
|
||||||
|
"id_dataset"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
},
|
||||||
|
"public.productos_descripcion_index": {
|
||||||
|
"name": "productos_descripcion_index",
|
||||||
|
"schema": "",
|
||||||
|
"columns": {
|
||||||
|
"id_producto": {
|
||||||
|
"name": "id_producto",
|
||||||
|
"type": "bigint",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_descripcion": {
|
||||||
|
"name": "productos_descripcion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"productos_marca": {
|
||||||
|
"name": "productos_marca",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {
|
||||||
|
"productos_descripcion_index_search_descripcion": {
|
||||||
|
"name": "productos_descripcion_index_search_descripcion",
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"expression": "to_tsvector('spanish', \"productos_descripcion\")",
|
||||||
|
"asc": true,
|
||||||
|
"isExpression": true,
|
||||||
|
"nulls": "last"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isUnique": false,
|
||||||
|
"concurrently": false,
|
||||||
|
"method": "gin",
|
||||||
|
"with": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {
|
||||||
|
"productos_descripcion_index_productos_descripcion_unique": {
|
||||||
|
"name": "productos_descripcion_index_productos_descripcion_unique",
|
||||||
|
"nullsNotDistinct": false,
|
||||||
|
"columns": [
|
||||||
|
"productos_descripcion"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"public.sucursales": {
|
||||||
|
"name": "sucursales",
|
||||||
|
"schema": "",
|
||||||
|
"columns": {
|
||||||
|
"id_dataset": {
|
||||||
|
"name": "id_dataset",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_comercio": {
|
||||||
|
"name": "id_comercio",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_bandera": {
|
||||||
|
"name": "id_bandera",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"id_sucursal": {
|
||||||
|
"name": "id_sucursal",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_nombre": {
|
||||||
|
"name": "sucursales_nombre",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_tipo": {
|
||||||
|
"name": "sucursales_tipo",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_calle": {
|
||||||
|
"name": "sucursales_calle",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_numero": {
|
||||||
|
"name": "sucursales_numero",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_latitud": {
|
||||||
|
"name": "sucursales_latitud",
|
||||||
|
"type": "numeric",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_longitud": {
|
||||||
|
"name": "sucursales_longitud",
|
||||||
|
"type": "numeric",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_observaciones": {
|
||||||
|
"name": "sucursales_observaciones",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_barrio": {
|
||||||
|
"name": "sucursales_barrio",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_codigo_postal": {
|
||||||
|
"name": "sucursales_codigo_postal",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_localidad": {
|
||||||
|
"name": "sucursales_localidad",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_provincia": {
|
||||||
|
"name": "sucursales_provincia",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_lunes_horario_atencion": {
|
||||||
|
"name": "sucursales_lunes_horario_atencion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_martes_horario_atencion": {
|
||||||
|
"name": "sucursales_martes_horario_atencion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_miercoles_horario_atencion": {
|
||||||
|
"name": "sucursales_miercoles_horario_atencion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_jueves_horario_atencion": {
|
||||||
|
"name": "sucursales_jueves_horario_atencion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_viernes_horario_atencion": {
|
||||||
|
"name": "sucursales_viernes_horario_atencion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_sabado_horario_atencion": {
|
||||||
|
"name": "sucursales_sabado_horario_atencion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"sucursales_domingo_horario_atencion": {
|
||||||
|
"name": "sucursales_domingo_horario_atencion",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"sucursales_id_dataset_datasets_id_fk": {
|
||||||
|
"name": "sucursales_id_dataset_datasets_id_fk",
|
||||||
|
"tableFrom": "sucursales",
|
||||||
|
"tableTo": "datasets",
|
||||||
|
"columnsFrom": [
|
||||||
|
"id_dataset"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {
|
||||||
|
"sucursales_id_dataset_id_comercio_id_bandera_id_sucursal_key": {
|
||||||
|
"name": "sucursales_id_dataset_id_comercio_id_bandera_id_sucursal_key",
|
||||||
|
"nullsNotDistinct": false,
|
||||||
|
"columns": [
|
||||||
|
"id_dataset",
|
||||||
|
"id_comercio",
|
||||||
|
"id_bandera",
|
||||||
|
"id_sucursal"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"enums": {},
|
||||||
|
"schemas": {},
|
||||||
|
"sequences": {},
|
||||||
|
"_meta": {
|
||||||
|
"columns": {},
|
||||||
|
"schemas": {},
|
||||||
|
"tables": {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -29,6 +29,13 @@
|
||||||
"when": 1726283266814,
|
"when": 1726283266814,
|
||||||
"tag": "0003_strong_bucky",
|
"tag": "0003_strong_bucky",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 4,
|
||||||
|
"version": "7",
|
||||||
|
"when": 1726534597731,
|
||||||
|
"tag": "0004_mushy_ultragirl",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
import { db } from '$lib/server/db';
|
import { db } from '$lib/server/db';
|
||||||
import * as schema from '$lib/server/db/schema';
|
import * as schema from '$lib/server/db/schema';
|
||||||
import { sql } from 'drizzle-orm';
|
import { ilike, or, sql } from 'drizzle-orm';
|
||||||
import type { PageServerLoad } from './$types';
|
import type { PageServerLoad } from './$types';
|
||||||
import * as Sentry from '@sentry/sveltekit';
|
import * as Sentry from '@sentry/sveltekit';
|
||||||
|
|
||||||
|
@ -32,7 +32,12 @@ JOIN latest_datasets ld ON p.id_dataset = ld.id
|
||||||
WHERE p.id_producto = productos_descripcion_index.id_producto)`.as('in_datasets_count')
|
WHERE p.id_producto = productos_descripcion_index.id_producto)`.as('in_datasets_count')
|
||||||
})
|
})
|
||||||
.from(schema.productos_descripcion_index)
|
.from(schema.productos_descripcion_index)
|
||||||
.where(sql`productos_descripcion ILIKE ${`%${query}%`}`)
|
.where(
|
||||||
|
or(
|
||||||
|
sql`to_tsvector('spanish', ${schema.productos_descripcion_index.productos_descripcion}) @@ to_tsquery('spanish', ${query})`,
|
||||||
|
ilike(schema.productos_descripcion_index.productos_marca, `%${query}%`)
|
||||||
|
)
|
||||||
|
)
|
||||||
.orderBy(sql`in_datasets_count desc`)
|
.orderBy(sql`in_datasets_count desc`)
|
||||||
.limit(100);
|
.limit(100);
|
||||||
const productos = await Sentry.startSpan(
|
const productos = await Sentry.startSpan(
|
||||||
|
|
Loading…
Reference in a new issue