go integration and wikipedia
This commit is contained in:
parent
47a252e339
commit
ee90335b92
7828 changed files with 1307913 additions and 20807 deletions
296
init-db/00-complete-schema.sql
Normal file
296
init-db/00-complete-schema.sql
Normal file
|
|
@ -0,0 +1,296 @@
|
|||
-- =============================================================================
|
||||
-- RSS2 - Script de inicialización completa de base de datos
|
||||
-- Este script crea todas las tablas y columnas necesarias para el sistema
|
||||
-- IMPORTANTE: Las tablas deben crearse en orden correcto (sin referencias a tablas que no existen)
|
||||
-- Se ejecuta automáticamente al iniciar PostgreSQL (directorio init-db)
|
||||
-- =============================================================================
|
||||
|
||||
-- =============================================================================
|
||||
-- SECCIÓN 1: TABLAS BASE (sin foreign keys a otras tablas del schema)
|
||||
-- =============================================================================
|
||||
|
||||
-- Tabla de usuarios (Auth)
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id SERIAL PRIMARY KEY,
|
||||
username VARCHAR(50) NOT NULL UNIQUE,
|
||||
email VARCHAR(255) NOT NULL UNIQUE,
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
is_admin BOOLEAN DEFAULT FALSE,
|
||||
role VARCHAR(20) DEFAULT 'user',
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||||
|
||||
-- Tabla de configuración (Sistema)
|
||||
CREATE TABLE IF NOT EXISTS config (
|
||||
key VARCHAR(100) PRIMARY KEY,
|
||||
value TEXT,
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
-- Insertar configuración por defecto si no existe
|
||||
INSERT INTO config (key, value) VALUES ('translator_type', 'cpu') ON CONFLICT (key) DO NOTHING;
|
||||
INSERT INTO config (key, value) VALUES ('translator_workers', '2') ON CONFLICT (key) DO NOTHING;
|
||||
INSERT INTO config (key, value) VALUES ('translator_status', 'stopped') ON CONFLICT (key) DO NOTHING;
|
||||
|
||||
-- Tablas básicas
|
||||
CREATE TABLE IF NOT EXISTS continentes (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(50) NOT NULL UNIQUE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS categorias (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(100) NOT NULL UNIQUE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS paises (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(100) NOT NULL,
|
||||
continente_id INTEGER REFERENCES continentes(id) ON DELETE SET NULL
|
||||
);
|
||||
|
||||
-- Tabla de feeds
|
||||
CREATE TABLE IF NOT EXISTS feeds (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(255),
|
||||
descripcion TEXT,
|
||||
url TEXT NOT NULL UNIQUE,
|
||||
categoria_id INTEGER REFERENCES categorias(id) ON DELETE SET NULL,
|
||||
pais_id INTEGER REFERENCES paises(id) ON DELETE SET NULL,
|
||||
idioma CHAR(2),
|
||||
activo BOOLEAN DEFAULT TRUE,
|
||||
fallos INTEGER DEFAULT 0,
|
||||
last_etag TEXT,
|
||||
last_modified TEXT,
|
||||
last_error TEXT,
|
||||
last_fetch TIMESTAMP
|
||||
);
|
||||
|
||||
-- Tabla de fuentes URL
|
||||
CREATE TABLE IF NOT EXISTS fuentes_url (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(255) NOT NULL,
|
||||
url TEXT NOT NULL UNIQUE,
|
||||
categoria_id INTEGER REFERENCES categorias(id) ON DELETE SET NULL,
|
||||
pais_id INTEGER REFERENCES paises(id) ON DELETE SET NULL,
|
||||
idioma CHAR(2) DEFAULT 'es',
|
||||
last_check TIMESTAMP,
|
||||
last_status VARCHAR(50),
|
||||
status_message TEXT,
|
||||
last_http_code INTEGER,
|
||||
active BOOLEAN DEFAULT TRUE
|
||||
);
|
||||
|
||||
-- Tabla de noticias
|
||||
CREATE TABLE IF NOT EXISTS noticias (
|
||||
id VARCHAR(32) PRIMARY KEY,
|
||||
titulo TEXT,
|
||||
resumen TEXT,
|
||||
url TEXT NOT NULL UNIQUE,
|
||||
fecha TIMESTAMP,
|
||||
imagen_url TEXT,
|
||||
fuente_nombre VARCHAR(255),
|
||||
categoria_id INTEGER REFERENCES categorias(id) ON DELETE SET NULL,
|
||||
pais_id INTEGER REFERENCES paises(id) ON DELETE SET NULL,
|
||||
tsv tsvector,
|
||||
topics_processed BOOLEAN DEFAULT FALSE,
|
||||
lang CHAR(5)
|
||||
);
|
||||
|
||||
-- Agregar columna lang si no existe
|
||||
ALTER TABLE noticias ADD COLUMN IF NOT EXISTS lang CHAR(5);
|
||||
|
||||
-- Trigger para búsqueda full-text en noticias
|
||||
CREATE OR REPLACE FUNCTION noticias_tsv_trigger() RETURNS trigger AS $$
|
||||
BEGIN
|
||||
new.tsv := setweight(to_tsvector('spanish', coalesce(new.titulo,'')), 'A') ||
|
||||
setweight(to_tsvector('spanish', coalesce(new.resumen,'')), 'B');
|
||||
return new;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
DROP TRIGGER IF EXISTS tsvectorupdate ON noticias;
|
||||
CREATE TRIGGER tsvectorupdate
|
||||
BEFORE INSERT OR UPDATE ON noticias
|
||||
FOR EACH ROW EXECUTE PROCEDURE noticias_tsv_trigger();
|
||||
|
||||
CREATE INDEX IF NOT EXISTS noticias_tsv_idx ON noticias USING gin(tsv);
|
||||
|
||||
-- Tabla de eventos (CRÍTICO: debe crearse ANTES de traducciones)
|
||||
CREATE TABLE IF NOT EXISTS eventos (
|
||||
id SERIAL PRIMARY KEY,
|
||||
titulo VARCHAR(255),
|
||||
descripcion TEXT,
|
||||
fecha TIMESTAMP,
|
||||
fuente VARCHAR(100),
|
||||
url TEXT,
|
||||
idioma CHAR(2),
|
||||
pais_id INTEGER REFERENCES paises(id) ON DELETE SET NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS tags (
|
||||
id SERIAL PRIMARY KEY,
|
||||
valor VARCHAR(255) NOT NULL,
|
||||
tipo VARCHAR(32) NOT NULL,
|
||||
UNIQUE(valor, tipo)
|
||||
);
|
||||
|
||||
-- Tabla de topics
|
||||
CREATE TABLE IF NOT EXISTS topics (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(100) NOT NULL UNIQUE,
|
||||
descripcion TEXT,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
weight REAL,
|
||||
keywords TEXT
|
||||
);
|
||||
|
||||
-- Agregar columnas faltantes si no existen
|
||||
ALTER TABLE topics ADD COLUMN IF NOT EXISTS weight REAL;
|
||||
ALTER TABLE topics ADD COLUMN IF NOT EXISTS keywords TEXT;
|
||||
|
||||
-- =============================================================================
|
||||
-- SECCIÓN 2: TABLAS DEPENDIENTES (con foreign keys a tablas de arriba)
|
||||
-- =============================================================================
|
||||
|
||||
-- Tabla de traducciones (referencia noticias Y eventos)
|
||||
CREATE TABLE IF NOT EXISTS traducciones (
|
||||
id SERIAL PRIMARY KEY,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
lang_from CHAR(5),
|
||||
lang_to CHAR(5) NOT NULL,
|
||||
titulo_trad TEXT,
|
||||
resumen_trad TEXT,
|
||||
status VARCHAR(16) DEFAULT 'done',
|
||||
error TEXT,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
evento_id BIGINT REFERENCES eventos(id),
|
||||
locked_at TIMESTAMP,
|
||||
vectorized BOOLEAN DEFAULT FALSE,
|
||||
UNIQUE (noticia_id, lang_to)
|
||||
);
|
||||
|
||||
-- Agregar columnas faltantes si no existen
|
||||
ALTER TABLE traducciones ADD COLUMN IF NOT EXISTS locked_at TIMESTAMP;
|
||||
ALTER TABLE traducciones ADD COLUMN IF NOT EXISTS vectorized BOOLEAN DEFAULT FALSE;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_noticia_lang_status ON traducciones(noticia_id, lang_to, status);
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_created_at ON traducciones(created_at);
|
||||
|
||||
-- Tabla pivote eventos_noticias
|
||||
CREATE TABLE IF NOT EXISTS eventos_noticias (
|
||||
id SERIAL PRIMARY KEY,
|
||||
evento_id INTEGER REFERENCES eventos(id) ON DELETE CASCADE,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
traduccion_id INTEGER REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de favoritos
|
||||
CREATE TABLE IF NOT EXISTS favoritos (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(user_id, noticia_id)
|
||||
);
|
||||
|
||||
-- Tabla de search history
|
||||
CREATE TABLE IF NOT EXISTS search_history (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||
query VARCHAR(255),
|
||||
category_id INTEGER,
|
||||
country_id INTEGER,
|
||||
results_count INTEGER DEFAULT 0,
|
||||
searched_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de news_topics
|
||||
CREATE TABLE IF NOT EXISTS news_topics (
|
||||
id SERIAL PRIMARY KEY,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
topic_id INTEGER REFERENCES topics(id) ON DELETE CASCADE,
|
||||
confidence REAL,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(noticia_id, topic_id)
|
||||
);
|
||||
|
||||
-- Tabla de related_noticias
|
||||
CREATE TABLE IF NOT EXISTS related_noticias (
|
||||
id SERIAL PRIMARY KEY,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
related_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
traduccion_id INTEGER REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
score REAL,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de tags_noticia
|
||||
CREATE TABLE IF NOT EXISTS tags_noticia (
|
||||
id SERIAL PRIMARY KEY,
|
||||
tag_id INTEGER REFERENCES tags(id) ON DELETE CASCADE,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
traduccion_id INTEGER REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(tag_id, noticia_id)
|
||||
);
|
||||
|
||||
-- =============================================================================
|
||||
-- SECCIÓN 3: OTRAS TABLAS
|
||||
-- =============================================================================
|
||||
|
||||
-- Tabla de entity aliases
|
||||
CREATE TABLE IF NOT EXISTS entity_aliases (
|
||||
id SERIAL PRIMARY KEY,
|
||||
canonical_name VARCHAR(255) NOT NULL,
|
||||
alias VARCHAR(255) NOT NULL,
|
||||
tipo VARCHAR(50) NOT NULL CHECK (tipo IN ('persona', 'organizacion', 'lugar', 'tema')),
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE(alias, tipo)
|
||||
);
|
||||
|
||||
-- Tabla de traduccion_embeddings
|
||||
CREATE TABLE IF NOT EXISTS traduccion_embeddings (
|
||||
id SERIAL PRIMARY KEY,
|
||||
traduccion_id INTEGER REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
model TEXT NOT NULL,
|
||||
dim INT NOT NULL,
|
||||
embedding DOUBLE PRECISION[] NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE (traduccion_id, model)
|
||||
);
|
||||
|
||||
-- Tabla de videos
|
||||
CREATE TABLE IF NOT EXISTS videos (
|
||||
id SERIAL PRIMARY KEY,
|
||||
titulo VARCHAR(255),
|
||||
descripcion TEXT,
|
||||
url TEXT NOT NULL UNIQUE,
|
||||
thumbnail_url TEXT,
|
||||
duration INTEGER,
|
||||
published_at TIMESTAMP,
|
||||
fuente VARCHAR(100),
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de video_parrillas
|
||||
CREATE TABLE IF NOT EXISTS video_parrillas (
|
||||
id SERIAL PRIMARY KEY,
|
||||
titulo VARCHAR(255) NOT NULL,
|
||||
descripcion TEXT,
|
||||
fecha_inicio TIMESTAMP,
|
||||
fecha_fin TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- =============================================================================
|
||||
-- NOTIFICAR QUE LA INICIALIZACIÓN ESTÁ COMPLETA
|
||||
-- =============================================================================
|
||||
DO $$
|
||||
BEGIN
|
||||
RAISE NOTICE 'RSS2 Base de datos inicializada correctamente';
|
||||
END $$;
|
||||
|
|
@ -1,24 +1,17 @@
|
|||
-- init-db/06-tags.sql (modelo simple compatible con ner_worker.py)
|
||||
-- init-db/06-tags.sql (compatible with existing schema from 00-complete-schema.sql)
|
||||
|
||||
-- Tabla de tags
|
||||
CREATE TABLE IF NOT EXISTS tags (
|
||||
id SERIAL PRIMARY KEY,
|
||||
valor TEXT NOT NULL,
|
||||
tipo TEXT NOT NULL, -- 'persona','organizacion','lugar', ...
|
||||
UNIQUE (valor, tipo)
|
||||
);
|
||||
|
||||
-- Relación tag <-> traducción
|
||||
CREATE TABLE IF NOT EXISTS tags_noticia (
|
||||
id SERIAL PRIMARY KEY,
|
||||
traduccion_id INT NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
tag_id INT NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
|
||||
UNIQUE (traduccion_id, tag_id)
|
||||
);
|
||||
-- Tabla de tags ya existe en 00-complete-schema.sql con columnas 'valor' y 'tipo'
|
||||
-- Solo crear índices adicionales si no existen
|
||||
|
||||
-- Índices útiles
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_valor ON tags(valor);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_tipo ON tags(tipo);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_tipo ON tags(tipo);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_noticia_trid ON tags_noticia(traduccion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_noticia_tag ON tags_noticia(tag_id);
|
||||
|
||||
-- Wikipedia data columns
|
||||
ALTER TABLE tags ADD COLUMN IF NOT EXISTS wiki_summary TEXT;
|
||||
ALTER TABLE tags ADD COLUMN IF NOT EXISTS wiki_url TEXT;
|
||||
ALTER TABLE tags ADD COLUMN IF NOT EXISTS image_path TEXT;
|
||||
ALTER TABLE tags ADD COLUMN IF NOT EXISTS wiki_checked BOOLEAN DEFAULT FALSE;
|
||||
ALTER TABLE tags ADD COLUMN IF NOT EXISTS wiki_checked BOOLEAN DEFAULT FALSE;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
-- init-db/07-tags-views.sql
|
||||
-- Vista de Top tags (24h) para el esquema:
|
||||
-- tags(id, valor, tipo)
|
||||
-- Vista de Top tags (24h) para el esquema existente:
|
||||
-- tags(id, nombre)
|
||||
-- tags_noticia(id, traduccion_id, tag_id)
|
||||
-- traducciones(id, noticia_id, lang_to, status, ...)
|
||||
-- noticias(id, fecha, ...)
|
||||
|
|
@ -8,8 +8,7 @@
|
|||
CREATE OR REPLACE VIEW public.v_tag_counts_24h AS
|
||||
SELECT
|
||||
tg.id,
|
||||
tg.valor,
|
||||
tg.tipo,
|
||||
tg.valor AS tag_name,
|
||||
COUNT(*) AS apariciones
|
||||
FROM public.tags tg
|
||||
JOIN public.tags_noticia tn ON tn.tag_id = tg.id
|
||||
|
|
@ -18,7 +17,7 @@ JOIN public.noticias n ON n.id = t.noticia_id
|
|||
WHERE t.status = 'done'
|
||||
AND t.lang_to = 'es'
|
||||
AND n.fecha >= now() - INTERVAL '24 hours'
|
||||
GROUP BY tg.id, tg.valor, tg.tipo
|
||||
GROUP BY tg.id, tg.valor
|
||||
ORDER BY apariciones DESC, tg.valor;
|
||||
|
||||
-- Índices recomendados para acelerar la vista (idempotentes)
|
||||
|
|
@ -34,9 +33,3 @@ CREATE INDEX IF NOT EXISTS idx_tags_noticia_traduccion
|
|||
CREATE INDEX IF NOT EXISTS idx_tags_noticia_tag
|
||||
ON public.tags_noticia (tag_id);
|
||||
|
||||
-- (Opcionales si no existen ya, pero ayudan en búsquedas ad hoc)
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_valor
|
||||
ON public.tags (valor);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_tipo
|
||||
ON public.tags (tipo);
|
||||
|
||||
|
|
|
|||
|
|
@ -32,14 +32,14 @@ FROM traduccion_embeddings te
|
|||
WHERE te.model = 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS related_noticias (
|
||||
traduccion_id INT NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
related_traduccion_id INT NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
score DOUBLE PRECISION NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
PRIMARY KEY (traduccion_id, related_traduccion_id),
|
||||
CHECK (traduccion_id <> related_traduccion_id)
|
||||
id SERIAL PRIMARY KEY,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
related_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
traduccion_id INT REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
score DOUBLE PRECISION NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_related_by_tr ON related_noticias (traduccion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_related_by_relatedtr ON related_noticias (related_traduccion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_related_by_relatedid ON related_noticias (related_id);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,38 +1,21 @@
|
|||
BEGIN;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS eventos (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
creado_en TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
actualizado_en TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
titulo TEXT,
|
||||
fecha_inicio TIMESTAMPTZ,
|
||||
fecha_fin TIMESTAMPTZ,
|
||||
n_noticias INTEGER NOT NULL DEFAULT 0,
|
||||
centroid JSONB NOT NULL,
|
||||
total_traducciones INTEGER NOT NULL DEFAULT 1
|
||||
);
|
||||
|
||||
-- Tabla eventos ya existe en 00-complete-schema.sql
|
||||
-- Agregar columna evento_id a traducciones si no existe
|
||||
ALTER TABLE traducciones
|
||||
ADD COLUMN IF NOT EXISTS evento_id BIGINT REFERENCES eventos(id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS eventos_noticias (
|
||||
evento_id BIGINT NOT NULL REFERENCES eventos(id) ON DELETE CASCADE,
|
||||
noticia_id VARCHAR(32) NOT NULL REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
traduccion_id INTEGER NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (evento_id, noticia_id)
|
||||
);
|
||||
-- Tabla eventos_noticias ya existe en 00-complete-schema.sql
|
||||
|
||||
-- Índices adicionales
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_evento
|
||||
ON traducciones(evento_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_evento_fecha
|
||||
ON traducciones(evento_id, noticia_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_trad_id
|
||||
ON traducciones(id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_eventos_fecha_inicio
|
||||
ON eventos (fecha_inicio DESC NULLS LAST);
|
||||
CREATE INDEX IF NOT EXISTS idx_eventos_fecha
|
||||
ON eventos (fecha DESC NULLS LAST);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_eventos_noticias_evento
|
||||
ON eventos_noticias (evento_id);
|
||||
|
|
@ -43,20 +26,5 @@ CREATE INDEX IF NOT EXISTS idx_eventos_noticias_noticia
|
|||
CREATE INDEX IF NOT EXISTS idx_eventos_noticias_traduccion
|
||||
ON eventos_noticias (traduccion_id);
|
||||
|
||||
CREATE OR REPLACE FUNCTION actualizar_evento_modificado()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.actualizado_en = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_evento_modificado ON eventos;
|
||||
|
||||
CREATE TRIGGER trg_evento_modificado
|
||||
BEFORE UPDATE ON eventos
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION actualizar_evento_modificado();
|
||||
|
||||
COMMIT;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,5 @@
|
|||
-- Favorites table for saving news
|
||||
CREATE TABLE IF NOT EXISTS favoritos (
|
||||
id SERIAL PRIMARY KEY,
|
||||
session_id VARCHAR(64) NOT NULL,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE (session_id, noticia_id)
|
||||
);
|
||||
-- Tabla favoritos ya existe en 00-complete-schema.sql con columna user_id
|
||||
-- Agregar índices adicionales
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_favoritos_session ON favoritos(session_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_favoritos_user ON favoritos(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_favoritos_noticia ON favoritos(noticia_id);
|
||||
|
|
|
|||
|
|
@ -1,79 +1,4 @@
|
|||
-- Create Topics Table
|
||||
CREATE TABLE IF NOT EXISTS topics (
|
||||
id SERIAL PRIMARY KEY,
|
||||
slug VARCHAR(50) UNIQUE NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
weight INTEGER DEFAULT 1,
|
||||
keywords TEXT,
|
||||
group_name VARCHAR(50)
|
||||
);
|
||||
-- Tablas topics y news_topics ya existen en 00-complete-schema.sql con columnas: nombre, descripcion, weight, keywords
|
||||
-- Agregar índice adicional
|
||||
|
||||
-- Create News Topics Relation Table
|
||||
CREATE TABLE IF NOT EXISTS news_topics (
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
topic_id INTEGER REFERENCES topics(id) ON DELETE CASCADE,
|
||||
score INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
PRIMARY KEY (noticia_id, topic_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_news_topics_score ON news_topics(score DESC);
|
||||
|
||||
-- Insert Initial Topics Data
|
||||
-- Uses ON CONFLICT to update if exists.
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('middle_east', 'Oriente Medio', 5, 'israel,estado de israel,tel aviv,jerusalén,al quds,gaza,franja de gaza,rafah,jan yunis,cisjordania,territorios ocupados,palestina,autoridad nacional palestina,anp,ramala,iran,república islámica de iran,teherán,isfahán,qom,iraq,irak,bagdad,basora,kurdistán iraquí,erbil,siria,damasco,aleppo,idlib,raqqa,líbano,beirut,sur del líbano,jordania,ammán,arabia saudí,riad,la meca,medina,emiratos árabes,emiratos árabes unidos,uae,dubái,abudabi,sharjah,qatar,doha,kuwait,bahrein,bahréin,manama,oman,yemen,saná,aden,hamas,hamás,yihad islámica,islamic jihad,hezbolá,hizbulá,hezbollah,hutíes,rebeldes hutíes,houthi,ansar allah,isis,estado islámico,daesh,al qaeda,talibanes,fatah,peshmerga,ypg,fds,milicias chiíes,pmu,pasdarán,guardia revolucionaria iraní,irgc,bombardeo,bombardeos,ataque aéreo,ataque con drones,drones suicidas,misiles,cohetes,misil balístico,misil de crucero,iron dome,cúpula de hierro,interceptores,sirenas antiaéreas,incursión terrestre,operación militar,ofensiva,contraofensiva,combates,enfrentamientos,hostilidades,escalada militar,movilización militar,fuerzas armadas,retirada de tropas,zona desmilitarizada,frontera norte,frontera sur,rehenes,liberación de rehenes,intercambio de prisioneros,secuestro,negociación de rehenes,crisis humanitaria,desplazados,refugiados,campamentos,asedio,bloqueo,corte de suministros,hambruna,escasez de agua,ayuda humanitaria,unrwa,alto el fuego,tregua,mediación egipcia,mediación qatarí,acuerdos de abraham,normalización diplomática,liga árabe,cumbre árabe,cumbre del golfo,negociaciones israelo-palestinas,solución de dos estados,relaciones árabe-israelíes,relaciones palestino-israelíes,países del golfo,monarquías del golfo,injerencia iraní,influencia saudí,diplomacia regional,petróleo,crudo,brent,wti,oleoducto,gasoducto,refinería,infraestructura energética,opep,opec,opep+,producción petrolera,gas natural,catar gas,estrecho de hormuz,mar rojo,golfo pérsico,golfo de aden,suní,chií,chiita,wahabismo,salafismo,conflicto sectario,tensión sectaria,lugares sagrados,peregrinación,ramadán,hajj,terrorismo,atentado,explosión,radicalización,células terroristas,operación antiterrorista,servicios secretos,inteligencia militar,contrainteligencia,oriente medio,medio oriente,mashreq,levant,inestabilidad regional,crisis del golfo,conflicto en oriente medio')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('ukraine_russia', 'Ucrania / Rusia', 5, 'ucrania,estado ucraniano,kyiv,kiev,odesa,lviv,rusia,federación rusa,moscú,san petersburgo,zelensky,zelenski,volodímir zelenski,putin,vladímir putin,kremlin,dimitri peskov,sergei lavrov,donbás,donbas,donetsk,donesk,oblast de donetsk,lugansk,luhansk,oblast de lugansk,crimea,sebastopol,península de crimea,mariúpol,jersón,zaporizhzhia,jarkov,sumy,bahmut,avdiivka,lyman,soledar,invasión,invadir,ataque ruso,agresión rusa,contraofensiva,ofensiva ucraniana,ofensiva rusa,bombardeo,ataques masivos,ataques nocturnos,artillería,ataque con misiles,ataque con drones,drones kamikaze,shahed,geran-2,lanzadores múltiples,misiles hipersónicos,kizhal,iskander,kalibr,sistema antiaéreo,patriot,nasams,s-300,s-400,defensa aérea,interceptores,sirenas antiaéreas,fuerzas armadas ucranianas,fuerzas armadas rusas,wagner,grupo wagner,rosgvardia,militares movilizados,reservistas,mercenarios,voluntarios internacionales,anexión,territorios anexionados,referéndum falso,integración forzada,administración ocupante,rusificación,pasaporte ruso obligatorio,tanques leopard,abrams,challenger,vehículos blindados,bradley,artillería autopropulsada,munición de racimo,munición guiada,misiles tácticos,drones de reconocimiento,guerra electrónica,ciberataque ruso,guerra híbrida,desinformación,propaganda rusa,operaciones encubiertas,hackers prorrusos,ataques informáticos masivos,movilización,movilización parcial,llamamiento a filas,despliegue,reservistas,retirada,bajas,pérdidas militares,deserción,frente oriental,línea de contacto,trincheras,alianza occidental,apoyo militar occidental,otan,nato,unión europea,g7,sanciones,embargo,tope al petróleo ruso,precio del gas,negociaciones de paz,alto el fuego,mediación,acusaciones de crímenes de guerra,crímenes contra la humanidad,refugiados ucranianos,desplazados internos,crisis humanitaria,corte de electricidad,infraestructura destruida,ataques a civiles,bombardeos a infraestructura crítica,corredores humanitarios,evacuaciones masivas,gas ruso,nord stream,nord stream 2,oleoducto,gasoducto,corte de suministro,crisis energética europea,acuerdo de exportación de grano,corredor del mar negro,bloqueo portuario,ataques a puertos ucranianos,osce,onu en ucrania,observadores internacionales,ue apoyo a ucrania,fondo europeo de defensa,escalada nuclear,amenaza nuclear,retórica nuclear,conflicto en ucrania,guerra de ucrania,agresión rusa,resistencia ucraniana,estancamiento militar,frente de batalla,situación en el donbás')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('china', 'China / Asia Oriental', 5, 'china,república popular china,rpc,beijing,pekin,shanghai,guangzhou,shenzhen,hong kong,macau,tíbet,xinjiang,mongolia interior,xi jinping,líder chino,secretario general,partido comunista chino,pcc,comité central,politburó,congreso nacional del pueblo,asamblea nacional popular,primer ministro chino,consejo de estado,taiwán,taipei,estrecho de taiwán,islas kinmen,islas matsu,reunificación,independencia de taiwán,incursiones aéreas,zona de identificación de defensa aérea,adiz,ejercicios militares chinos,bloqueo simulado,flota del pacífico,tensiones sino-taiwanesas,corea del sur,seúl,japón,tokio,mar de china meridional,islas spratly,islas paracel,filipinas,vietnam,disputas territoriales en asia,acuartelamiento indo-pacífico,acuerdos en asia oriental,asean+3,diplomacia china,soft power chino,poder blando,guerra comercial,relaciones sino estadounidenses,relaciones china rusia,alianza estratégica china rusia,cumbre de la unasur china,foros regionales asiáticos,g20,brics,brics+,ruta de la seda,nueva ruta de la seda,belt and road,bri,iniciativa de la franja y la ruta,gdi,global development initiative,gsi,global security initiative,gci,global civilization initiative,hecho en china 2025,made in china 2025,dual circulation,aiib,asian infrastructure investment bank,sco,ocsh,shanghai cooperation organisation,rcep,regional comprehensive economic partnership,asean china,foros del este asiático,apec,cooperación asia-pacífico,semiconductores chinos,industria de chips,litografía china,huawei,zte,bytedance,tiktok,dji,supercomputación china,chips avanzados,restricciones de chips,bloqueo tecnológico eeuu china,ciberespionaje,ataques chinos,apt chino,hackers chinos,piratería estatal,robo tecnológico,ciberataque,gran cortafuegos,gran firewall de china,control de internet,vigilancia digital,ejército chino,pla,ejército de liberación popular,armada china,fuerza aérea china,misiles hipersónicos chinos,modernización militar china,cibercomando chino,marina del epl,guardia costera china,zona de exclusión aérea,maniobras militares,xinjiang,uigur,minorías uigures,reeducación,control social,vigilancia masiva,cámaras de reconocimiento facial,tíbet,libertades civiles en china,economía china,crecimiento chino,exportaciones chinas,industria manufacturera,crisis inmobiliaria china,evergrande,country garden,mercado inmobiliario chino,inversiones chinas,fondos soberanos de china,asia oriental,asia pacífico,indo pacífico,potencia asiática,superpotencia china,expansión china')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('eurasia_russia', 'Eurasia / Influencia Rusa', 4, 'unión euroasiática,eaeu,ueea,eurasian economic union,csto,otsc,collective security treaty organization,comunidad de estados independientes,cei,cis,organización del tratado de seguridad colectiva,parlamento euroasiático,espacio económico euroasiático,asia central,asia central rusa,antiguas repúblicas soviéticas,kazajistán,kazakhstan,astana,almaty,uzbekistán,uzbekistan,tashkent,kirguistán,kirguistan,kirguizistán,bishkek,tayikistán,tayikistan,dusambé,turkmenistán,turkmenistan,ashgabat,armenia,ereván,georgia,tiflis,moldavia,moldova,chisinau,bielorrusia,belarus,minsk,cáucaso sur,cáucaso norte,nagorno karabaj,artsaj,osetia del sur,abjasia,transnistria,donbás euroasiático,frontera ruso-georgiana,bases militares rusas,presencia militar rusa en asia central,fuerzas de paz rusas,operaciones de seguridad regional,ejercicios militares conjuntos,vostok,centr,organización del tratado de amistad y cooperación,cooperación policial euroasiática,centrado en seguridad,unión aduanera,aranceles euroasiáticos,bloque económico euroasiático,intercambio comercial con rusia,dependencia energética de rusia,corredores energéticos,oleoductos euroasiáticos,gasoductos rusos,acuerdos bilaterales con moscú,política económica euroasiática,gazprom,rosneft,transneft,lukoil,gasoducto fuerza de siberia,power of siberia,gasoducto asia central rusia,oleoducto bakú-tiflis-ceyhan,btc pipeline,energía euroasiática,seguridad energética del cáucaso,organización de cooperación de shanghái,sco,ocsh,alianza estratégica china rusia,eje pekín-moscú,rusia en asia central,influencia rusa en el cáucaso,geopolítica euroasiática,integración postsoviética,proyectos euroasiáticos,visitas de estado en asia central,migrantes de asia central en rusia,remesas a asia central,dependencia laboral,crisis fronterizas,rotación laboral regional,eurasia,espacio postsoviético,antiguo bloque soviético,influencia rusa,hegemonía rusa,zona de influencia rusa,vecindario cercano de rusia,near abroad,orden euroasiático,esfera rusa de influencia')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_globales', 'Organismos Globales', 5, 'onu,naciones unidas,naciones-unidas,asamblea general,consejo de seguridad,secretario general,resolución de la onu,misiones de paz,cascos azules,ecosoc,consejo económico y social,pnuma,programa de naciones unidas para el medio ambiente,pnud,programa de naciones unidas para el desarrollo,onu mujeres,fondo de población de la onu,unfpa,unrwa,agencia de onu para refugiados palestinos,unhabitat,unops,unesco,unido,oms,organización mundial de la salud,ops,organización panamericana de la salud,unicef,fao,acnur,oim,oit,oms,cruz roja internacional,cicr,robos humanitarios internacionales,fmi,fondo monetario internacional,banco mundial,bm,banco internacional de reconstrucción y fomento,bird,asociación internacional de fomento,aif,banco de pagos internacionales,bis,omc,organización mundial del comercio,ocde,organización para la cooperación y el desarrollo económicos,unctad,comercio y desarrollo,foro de davos,wef,foro económico mundial,g7,g20,club de parís,club de londres,corte penal internacional,cpi,tribunal internacional de justicia,tij,corte internacional de justicia,corte permanente de arbitraje,cpa,tribunales de la haya,la haya,oiea,organismo internacional de energía atómica,ctbto,organismo de control de pruebas nucleares,interpol,oficina internacional de policía criminal,onuad,desarme,convención sobre armas químicas,opaq,ipcc,panel intergubernamental del cambio climático,cop,cumbres climáticas,acuerdo de parís,onu clima,pnuma,programa medioambiental de la onu,unesco,organización de naciones unidas para la educación,oms,oms investigación,onu ciencia,oms cooperación global,movimiento de países no alineados,no aligned movement,nam,alianza global,cooperación multilateral,instituciones multilaterales,gobernanza global')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_occidente', 'Organismos Occidente', 5, 'unión europea,ue,comisión europea,ejecutivo comunitario,parlamento europeo,eurocámara,consejo europeo,consejo de la unión europea,consejo de ministros,tribunal de justicia de la unión europea,tjue,tribunal de cuentas europeo,servicio europeo de acción exterior,seae,alto representante de la ue,alto representante para asuntos exteriores,bce,banco central europeo,eurogrupo,mecanismo europeo de estabilidad,mee,rescate europeo,eurozona,zona euro,banco europeo de inversiones,bei,banco europeo de reconstrucción y desarrollo,berd,europol,oficina europea de policía,eurojust,cooperación judicial europea,frontex,agencia europea de fronteras,olaf,oficina europea de lucha contra el fraude,easa,agencia europea de seguridad aérea,ema,agencia europea del medicamento,enisa,agencia europea de ciberseguridad,eu-osha,agencia europea para la seguridad y salud en el trabajo,consejo de europa,tribunal europeo de derechos humanos,tedh,convención europea de derechos humanos,otan,nato,alianza atlántica,alianza del atlántico norte,mando aliado,ejercicios de la otan,osce,organización para la seguridad y la cooperación en europa,agencia europea de defensa,eda,ocde,organización para la cooperación y el desarrollo económicos,g7,cumbre del g7,g7 ampliado,club de países industrializados,efta,aelc,asociación europea de libre comercio,espacio económico europeo,eee,schengen,acuerdos de schengen,zona schengen,política de vecindad europea,vecindad oriental,pilar europeo de derechos sociales,estado de derecho en la ue,mecanismo del estado de derecho,cumbre eu-usa,relaciones transatlánticas,bloque occidental,alianza occidental,instituciones europeas,burocracia de bruselas,estructura comunitaria,marco institucional europeo')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_america', 'Organismos América', 4, 'oea,organización de los estados americanos,cidh,comisión interamericana de derechos humanos,corte idh,corte interamericana de derechos humanos,bid,banco interamericano de desarrollo,bcie,banco centroamericano de integración económica,caf,banco de desarrollo de américa latina,cepal,comisión económica para américa latina y el caribe,fonplata,fondo financiero para el desarrollo de la cuenca del plata,mercosur,mercosul,mercosur ampliado,unasur,unión de naciones suramericanas,alianza del pacífico,apec latinoamérica,alap,alba,alba-tcp,alternativa bolivariana para las américas,prosur,foro para el progreso de américa del sur,sica,sistema de la integración centroamericana,parlacen,parlamento centroamericano,caricom,comunidad del caribe,acs,asociación de estados del caribe,sela,sistema económico latinoamericano y caribeño,usmca,tmec,nafta,tratado de libre comercio de américa del norte,cumbre de líderes de américa del norte,alianza para la prosperidad,alianza energética norteamericana,junta interamericana de defensa,consejo de defensa suramericano,seguridad hemisférica,cooperación militar regional,celac,comunidad de estados latinoamericanos y caribeños,cumbre iberoamericana,secretaría general iberoamericana,segib,organismo andino de integración,comunidad andina,can,ops,organización panamericana de la salud,panam sports,odepa,organización deportiva panamericana,oit américas,unesco américa latina,retrofit latinoamérica,infraestructura regional,integración latinoamericana,cooperación regional,foros latinoamericanos,mecanismos regionales,agenda hemisférica,diplomacia regional')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_china_rusia', 'Org. China/Rusia/BRICS', 5, 'brics,brics+,nuevos brics,expansión de los brics,sco,ocsh,shanghai cooperation organisation,organización de cooperación de shanghái,belt and road,belt & road,bri,iniciativa de la franja y la ruta,ruta de la seda,nueva ruta de la seda,silk road,gdi,global development initiative,gsi,global security initiative,gci,global civilization initiative,made in china 2025,dual circulation strategy,aiib,asian infrastructure investment bank,nuevo banco de desarrollo,new development bank,ndb,banco euroasiático de desarrollo,banco asiático de inversión en infraestructura,csto,otsc,collective security treaty organization,organización del tratado de seguridad colectiva,eaeu,ueea,unión económica euroasiática,eurasian economic union,cei,cis,comunidad de estados independientes,rosatom,gazprom forum,foro energético ruso,foro de boao,boao forum for asia,asean+3,asean plus three,asia cooperation dialogue,acd,cica,conference on interaction and confidence building measures in asia,organización del tratado de amistad y cooperación,otl del caspio,caspian summit,consejo turco,turkic council,organización de estados túrquicos,ejercicios conjuntos china rusia,alianza militar euroasiática,cooperación militar sino-rusa,joint sea naval exercises,vostok ejercicios militares,rcep,regional comprehensive economic partnership,asian cooperation forum,cinturón económico de la ruta de la seda,eurasian land bridge,foro energético del caspio,acuerdos energéticos china rusia,gasoducto fuerza de siberia,power of siberia pipeline,foro petrolero euroasiático,multipolaridad,orden multipolar,alternativa a occidente,bloque euroasiático,cooperación sino-rusa,alianza estratégica china rusia')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('big_tech', 'Big Tech / Gigantes Tecnológicos', 4, 'apple,google,alphabet,tesla,spacex,amazon,meta,facebook,microsoft,netflix,nvidia,intel,amd,samsung,huawei,tiktok,bytedance,oracle,ibm,salesforce,adobe,alibaba,tencent,baidu,uber,airbnb,spotify,tim cook,sundar pichai,elon musk,mark zuckerberg,satya nadella,jeff bezos,jensen huang,reed hastings,jack ma,pony ma,zhang yiming,iphone,ipad,macbook,ios,macos,app store,android,google play,chrome,chromebook,gmail,google cloud,aws,amazon web services,azure,microsoft 365,office 365,teams,windows,xbox,meta quest,oculus,realidad virtual,realidad aumentada,tesla model 3,tesla model y,autopilot,full self driving,fsd,prime video,netflix,hbo max,disney+,tiktok app,instagram,whatsapp,messenger,youtube,youtube premium,plataforma digital,marketplace,ecommerce,comercio electrónico,suscripción,modelo freemium,publicidad digital,anuncios online,economía de plataforma,gig economy,economía colaborativa,cloud,computación en la nube,centros de datos,data center,edge computing,cdn,infraestructura cloud,paas,saas,iaas,kubernetes,docker,microservicios,vehículo eléctrico,coche eléctrico,supercargadores,red de carga,conducción autónoma,software de conducción,baterías,gigafactory,modelo de lenguaje,servicio de ia,ia en la nube,plataformas de inteligencia artificial,api de ia,servicios cognitivos,vision artificial en la nube,fusión,adquisición,m&a,compra de startup,venta de activos,spin-off,scisión empresarial,salida a bolsa,opv,ipo,valoración multimillonaria,unicornio,capital riesgo,posición dominante,monopolio digital,antimonopolio,antitrust,regulación tecnológica,ley de mercados digitales,protección de datos,privacidad,rgpd,gdpr,investigación regulatoria,multa antimonopolio,control de contenidos,moderación de contenidos,big tech,gigantes tecnológicos,empresas tecnológicas,multinacional tecnológica,ecosistema tecnológico,resultados trimestrales,beneficios récord,capitalización bursátil')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('economia_global', 'Economía Global', 4, 'economía,macroeconomía,pib,producto interior bruto,inflación,deflación,estanflación,recesión,desaceleración,crecimiento económico,actividad económica,balanza comercial,déficit,superávit,deuda pública,deuda soberana,estímulo fiscal,austeridad,ajuste estructural,mercados financieros,bolsa,acciones,índice bursátil,ibex,nasdaq,dow jones,sp500,ftse,nikkei,bonos,renta fija,renta variable,divisas,tipos de cambio,volatilidad,inversores,capitalización,crisis financiera,burbuja financiera,corrección del mercado,banca central,banco central,tipos de interés,política monetaria,quantitative easing,qe,subida de tipos,bce,fed,reserva federal,banco de inglaterra,banco de japón,tasa de referencia,inflación subyacente,petróleo,crudo,brent,wti,gas natural,carbón,energía,matérias primas,commodities,minería,cobre,litio,oro,plata,energía renovable,transición energética,opep,opep+,precio del petróleo,producción petrolera,comercio internacional,aranceles,exportaciones,importaciones,barreras comerciales,guerra comercial,organización mundial del comercio,omc,rcep,nafta,usmca,tratado de libre comercio,logística,cadena de suministro,supply chain,puertos,fletes,g7,g20,brics,fmi,fondo monetario internacional,banco mundial,ocde,foro de davos,wef,banco asiático de inversión,aiib,banco interamericano de desarrollo,bid,cepal,mercosur,unión europea económica,inversión,capital riesgo,private equity,fusiones y adquisiciones,m&a,inversión extranjera directa,ied,empresas multinacionales,gigantes empresariales,beneficios,dividendos,resultados trimestrales,balances,rentabilidad,bitcoin,ethereum,criptomonedas,criptoactivos,blockchain,fintech,banca digital,tokenización,defi,criptoexchange,volatilidad cripto,minería de bitcoin,crisis económica,crisis de deuda,crisis bancaria,riesgo país,tensiones económicas,colapso financiero,fuga de capitales,corralito,intervención estatal,desempleo,paro,ocupación,mercado laboral,salarios,negociación colectiva,coste de vida,pobreza,desigualdad,clase media,economía global,sistema financiero,competitividad,inestabilidad económica,política económica')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('desastres_y_crisis', 'Desastres y Crisis', 5, 'terremoto,sismo,seísmo,epicentro,magnitud,réplica,tsunami,maremoto,inundación,riada,lluvias torrenciales,crecida de río,huracán,tormenta tropical,tifón,ciclón,tornado,tormenta eléctrica,erupción volcánica,volcán,lava,ceniza volcánica,deslizamiento de tierra,corrimiento de tierras,alud,avalancha,sequía,ola de calor,ola de frío,incendio forestal,fuego,desastre natural,explosión,fuga tóxica,derrame químico,accidente industrial,planta química,accidente nuclear,reactor nuclear,radiación,fuga nuclear,contaminación,derrame petrolero,marea negra,colapso estructural,derrumbamiento,explosión de gas,accidente minero,atentado,ataque terrorista,terrorismo,bomba,artefacto explosivo,yihadista,estado islámico,isis,al qaeda,coche bomba,suicida,atacante,tiroteo masivo,radicalización,extremismo violento,guerra,conflicto armado,combates,batalla,frente de guerra,ofensiva,contraofensiva,bombardeo,incursión militar,ataque aéreo,ataque con drones,misiles,artillería,fuerzas armadas,tropas,movilización militar,invasión,ocupación,escalada,armamento,armas pesadas,genocidio,limpieza étnica,violaciones de derechos humanos,epidemia,pandemia,brote,virus,infección,covid,ebola,zika,gripe aviar,sars,mers,alerta sanitaria,cuarentena,aislamiento,contagio,colapso sanitario,emergencia de salud pública,crisis humanitaria,refugiados,desplazados,campamentos,hambruna,inseguridad alimentaria,falta de agua,ayuda humanitaria,emergencia humanitaria,crisis migratoria,socorro internacional,organizaciones de socorro,accidente,tragedia,fatalidades,víctimas,heridos,rescate,accidente de tráfico,accidente de carretera,accidente vial,colisión,choque frontal,alcance,salida de vía,autopista,carretera,caravana,atasco,retención,conductor herido,peatón atropellado,atropello,multitudinario,cadena de colisiones,choque múltiple,accidente de autobús,autobús volcado,accidente de camión,camión cisterna,vehículo incendiado,accidente mortal,accidente de avión,accidente aéreo,siniestralidad aérea,accidente ferroviario,descarrilamiento,tren siniestrado,accidente marítimo,naufragio,barco volcado,catástrofe,desastre,emergencia,alerta roja,alerta meteorológica,evacuación,crisis,devastación,pérdidas humanas,operativo de rescate')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('conflictos', 'Conflictos y Seguridad', 5, 'conflicto armado,guerra,guerra civil,combates,batalla,frente,frente de batalla,ofensiva,contraofensiva,incursión,incursión militar,invasión,ocupación,asedio,bombardeo,ataque aéreo,ataque terrestre,ataque con drones,misil,artillería,fuego cruzado,tropas,armamento,armas pesadas,militares,movilización,despliegue militar,zona de conflicto,golpe de estado,intentona golpista,junta militar,derrocamiento,toma del poder,ruptura institucional,estado de excepción,toque de queda,represión estatal,levantamiento,insurrección,motín,disturbios,protestas masivas,rebelión,sublevación,conflicto étnico,violencia sectaria,tensiones étnicas,limpieza étnica,persecución étnica,enfrentamiento tribal,violencia intercomunitaria,minorías perseguidas,atentado,ataque terrorista,terrorismo,extremismo,radicalización,yihadista,estado islámico,isis,al qaeda,talibanes,coche bomba,artefacto explosivo,suicida,milicia,guerrilla,grupo insurgente,insurgencia,paramilitares,señores de la guerra,cártel,mafia,crimen organizado,narcotráfico,tráfico de armas,tráfico de personas,extorsión,sicarios,bandas armadas,ciberataque,ciberataque masivo,hackeo,ataque informático,ataque ransomware,infiltración informática,phishing,ciberespionaje,filtración de datos,inteligencia militar,operación encubierta,guerra híbrida,desinformación,propaganda,sanciones,sanciones económicas,embargo,bloqueo económico,bloqueo comercial,castigo diplomático,retirada de embajadores,secuestro,rapto,toma de rehenes,ejecución,ejecución extrajudicial,asesinato político,magnicidio,intento de asesinato,masacre,tiroteo,fuerza letal,ataque coordinado,cascos azules,misión de paz,intervención militar,zona desmilitarizada,alto el fuego,tregua,acuerdo de paz,escalada,escalada militar,tensión internacional,amenaza,hostilidades,crisis de seguridad,conflicto internacional')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('elecciones_politica', 'Elecciones y Política', 3, 'elecciones,elección presidencial,elección parlamentaria,elecciones generales,elecciones regionales,elecciones locales,urna,votación,voto,recuento,escrutinio,participación electoral,abstención,jornada electoral,segunda vuelta,balotaje,candidato,candidatura,lista electoral,victoria electoral,derrota electoral,coalición electoral,campaña,mitin,debate electoral,debate televisado,programa electoral,promesas electorales,encuesta,sondeo,intención de voto,tracking electoral,eje izquierda-derecha,eslogan político,gira electoral,referéndum,plebiscito,consulta popular,consulta vinculante,autodeterminación,reforma constitucional,cambio de constitución,estatuto,referendo de independencia,fraude electoral,manipulación electoral,irregularidades,compra de votos,clientelismo,intimidación electoral,impugnación de resultados,protestas post-electorales,observadores internacionales,acusaciones de fraude,presidente,primer ministro,jefe de estado,jefe de gobierno,gabinete,ministro,secretario de estado,portavoz,alcalde,gobernador,diputado,senador,legislador,parlamento,asamblea,congreso,senado,cámara baja,cámara alta,comité parlamentario,mayoría absoluta,mayoría simple,oposición,disolución del parlamento,moción de censura,investidura,votación parlamentaria,partido político,coalición,alianza,bloque parlamentario,oposición política,izquierda,derecha,centro,extrema derecha,extrema izquierda,liberal,conservador,socialdemócrata,populismo,crisis política,dimisión,renuncia,interpelación,gobierno interino,vacancia,caída del gobierno,bloqueo institucional,parálisis política,estado de excepción político,política exterior,relaciones diplomáticas,acuerdos bilaterales,visita oficial,reconocimiento internacional,tensiones diplomáticas,embajador,ministerio de exteriores,corrupción,soborno,malversación,tráfico de influencias,escándalo político,investigación judicial,audiencia parlamentaria,comisión de investigación,imputación,procesamiento,manifestación,protesta,movilización,huelga general,huelga política,movimientos ciudadanos,activistas,revolución de colores,presión social,derechos civiles,gobierno,administración,estabilidad política,modelo político,transición política,proceso democrático,instituciones,estado de derecho,crisis institucional')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('tecnologia', 'Tecnología', 3, 'inteligencia artificial,ia,algoritmo,machine learning,deep learning,red neuronal,modelo de lenguaje,modelo generativo,llm,transformer,genai,openai,chatgpt,gpt,anthropic,claude,google gemini,llama,metallama,hugging face,inferencias,entrenamiento de modelos,fine tuning,datasets,vectorización,embeddings,visión artificial,nlp,procesamiento de lenguaje natural,chips,semiconductores,nanómetros,oblea,gpu,cpu,asic,intel,amd,nvidia,arm,tsmc,samsung semiconductors,litografía,europa chips act,chiplets,memoria hbm,vrm,arquitectura computacional,supercomputador,hpc,robot,robótica,robot humanoide,automatización,drones,vehículos autónomos,coche autónomo,autopilot,industria 4.0,digital twins,iot,internet de las cosas,sensores inteligentes,domótica,smart home,ciberseguridad,ciberataque,ciberdefensa,phishing,ransomware,malware,spyware,vulnerabilidad,cve,zero-day,hackeo,intrusión,filtración de datos,brecha de seguridad,criptografía,seguridad informática,firewall,5g,6g,fibra óptica,redes móviles,torres de telecomunicaciones,infraestructura de red,satélites,starlink,orbital,ancho de banda,latencia,internet global,operadores de telecomunicaciones,redes privadas,software,aplicación,plataforma digital,startup,ecosistema tech,innovación,transformación digital,saas,paas,iaas,cloud,nube,computación en la nube,servidores,microservicios,contenedores,docker,kubernetes,devops,código abierto,open source,repositorio,api,microchips,firmware,computación cuántica,qubits,enfriamiento criogénico,superposición cuántica,enlace cuántico,computación distribuida,edge computing,fog computing,holografía,realidad aumentada,realidad virtual,metaverso,xr,visión por computador,apple,google,alphabet,tesla,meta,amazon,microsoft,tim cook,sundar pichai,elon musk,mark zuckerberg,silicon valley,gigante tecnológico,unicornios,big data,data mining,análisis predictivo,modelos estadísticos,data science,científico de datos,pipelines de datos,lagos de datos,etl,warehouse,baterías,ion-litio,carga rápida,movilidad eléctrica,supercargadores,vehículo eléctrico,eficiencia energética,tecnologías verdes,energía inteligente,tecnología,sector tecnológico,ecosistema digital,innovación disruptiva,avance tecnológico,desarrollo tecnológico')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
CREATE INDEX IF NOT EXISTS idx_news_topics_confidence ON news_topics(confidence DESC);
|
||||
|
|
|
|||
|
|
@ -1,34 +1,4 @@
|
|||
-- Migración: Actualizar tabla favoritos para soportar usuarios autenticados
|
||||
-- Añade columna user_id manteniendo retrocompatibilidad con session_id
|
||||
-- Migración favoritos ya existente en 00-complete-schema.sql con columna user_id
|
||||
-- Verificar que existe el índice
|
||||
|
||||
-- Agregar columna user_id si no existe
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'favoritos' AND column_name = 'user_id'
|
||||
) THEN
|
||||
ALTER TABLE favoritos ADD COLUMN user_id INTEGER REFERENCES usuarios(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Modificar constraint UNIQUE para incluir user_id
|
||||
-- Primero eliminar constraint existente si existe
|
||||
ALTER TABLE favoritos DROP CONSTRAINT IF EXISTS favoritos_session_id_noticia_id_key;
|
||||
ALTER TABLE favoritos DROP CONSTRAINT IF EXISTS favoritos_unique_favorite;
|
||||
|
||||
-- Crear nuevo constraint que permite favoritos por user_id O session_id
|
||||
ALTER TABLE favoritos ADD CONSTRAINT favoritos_unique_favorite
|
||||
UNIQUE NULLS NOT DISTINCT (user_id, session_id, noticia_id);
|
||||
|
||||
-- Agregar check constraint: debe tener user_id O session_id (no ambos nulos)
|
||||
ALTER TABLE favoritos DROP CONSTRAINT IF EXISTS favoritos_user_or_session;
|
||||
ALTER TABLE favoritos ADD CONSTRAINT favoritos_user_or_session
|
||||
CHECK (user_id IS NOT NULL OR session_id IS NOT NULL);
|
||||
|
||||
-- Crear índice en user_id para búsquedas rápidas
|
||||
CREATE INDEX IF NOT EXISTS idx_favoritos_user_id ON favoritos(user_id);
|
||||
|
||||
-- Comentarios
|
||||
COMMENT ON COLUMN favoritos.user_id IS 'Usuario autenticado (NULL si es favorito anónimo)';
|
||||
COMMENT ON COLUMN favoritos.session_id IS 'ID de sesión anónima (NULL si usuario autenticado)';
|
||||
|
|
|
|||
|
|
@ -1,90 +1 @@
|
|||
-- Script SQL para crear tablas de parrillas de noticias para videos
|
||||
|
||||
-- Tabla principal de parrillas/programaciones
|
||||
CREATE TABLE IF NOT EXISTS video_parrillas (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(255) NOT NULL UNIQUE,
|
||||
descripcion TEXT,
|
||||
tipo_filtro VARCHAR(50) NOT NULL, -- 'pais', 'categoria', 'entidad', 'continente', 'custom'
|
||||
|
||||
-- Filtros
|
||||
pais_id INTEGER REFERENCES paises(id),
|
||||
categoria_id INTEGER REFERENCES categorias(id),
|
||||
continente_id INTEGER REFERENCES continentes(id),
|
||||
entidad_nombre VARCHAR(255), -- Para filtrar por persona/organización específica
|
||||
entidad_tipo VARCHAR(50), -- 'persona', 'organizacion'
|
||||
|
||||
-- Configuración de generación
|
||||
max_noticias INTEGER DEFAULT 5, -- Número máximo de noticias por video
|
||||
duracion_maxima INTEGER DEFAULT 180, -- Duración máxima en segundos
|
||||
idioma_voz VARCHAR(10) DEFAULT 'es', -- Idioma del TTS
|
||||
voz_modelo VARCHAR(100), -- Modelo de voz específico a usar
|
||||
|
||||
-- Configuración de diseño
|
||||
template VARCHAR(50) DEFAULT 'standard', -- 'standard', 'modern', 'minimal'
|
||||
include_images BOOLEAN DEFAULT true,
|
||||
include_subtitles BOOLEAN DEFAULT true,
|
||||
|
||||
-- Programación
|
||||
frecuencia VARCHAR(20), -- 'daily', 'weekly', 'manual'
|
||||
ultima_generacion TIMESTAMP,
|
||||
proxima_generacion TIMESTAMP,
|
||||
|
||||
-- Estado
|
||||
activo BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de videos generados
|
||||
CREATE TABLE IF NOT EXISTS video_generados (
|
||||
id SERIAL PRIMARY KEY,
|
||||
parrilla_id INTEGER REFERENCES video_parrillas(id) ON DELETE CASCADE,
|
||||
titulo VARCHAR(500) NOT NULL,
|
||||
descripcion TEXT,
|
||||
fecha_generacion TIMESTAMP DEFAULT NOW(),
|
||||
|
||||
-- Archivos
|
||||
video_path VARCHAR(500),
|
||||
audio_path VARCHAR(500),
|
||||
subtitles_path VARCHAR(500),
|
||||
thumbnail_path VARCHAR(500),
|
||||
|
||||
-- Metadata
|
||||
duracion INTEGER, -- en segundos
|
||||
num_noticias INTEGER,
|
||||
noticias_ids TEXT[], -- Array de IDs de noticias incluidas
|
||||
|
||||
-- Estado de procesamiento
|
||||
status VARCHAR(20) DEFAULT 'pending', -- 'pending', 'processing', 'completed', 'error'
|
||||
error_message TEXT,
|
||||
|
||||
-- Estadísticas
|
||||
views INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de noticias en videos (relación muchos a muchos)
|
||||
CREATE TABLE IF NOT EXISTS video_noticias (
|
||||
id SERIAL PRIMARY KEY,
|
||||
video_id INTEGER REFERENCES video_generados(id) ON DELETE CASCADE,
|
||||
noticia_id VARCHAR(100) NOT NULL,
|
||||
traduccion_id INTEGER REFERENCES traducciones(id),
|
||||
orden INTEGER NOT NULL, -- Orden de aparición en el video
|
||||
timestamp_inicio FLOAT, -- Segundo donde comienza esta noticia
|
||||
timestamp_fin FLOAT, -- Segundo donde termina esta noticia
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Índices para mejorar performance
|
||||
CREATE INDEX IF NOT EXISTS idx_parrillas_tipo ON video_parrillas(tipo_filtro);
|
||||
CREATE INDEX IF NOT EXISTS idx_parrillas_activo ON video_parrillas(activo);
|
||||
CREATE INDEX IF NOT EXISTS idx_parrillas_proxima ON video_parrillas(proxima_generacion);
|
||||
CREATE INDEX IF NOT EXISTS idx_videos_parrilla ON video_generados(parrilla_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_videos_status ON video_generados(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_videos_fecha ON video_generados(fecha_generacion DESC);
|
||||
|
||||
-- Comentarios para documentación
|
||||
COMMENT ON TABLE video_parrillas IS 'Configuraciones de parrillas de noticias para generar videos automáticos';
|
||||
COMMENT ON TABLE video_generados IS 'Videos generados a partir de parrillas de noticias';
|
||||
COMMENT ON TABLE video_noticias IS 'Relación entre videos y las noticias que contienen';
|
||||
-- Tabla video_parrillas ya existe en 00-complete-schema.sql
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue