# PgVector Post Embeddings Schema Este es el contrato actual para guardar publicaciones derivadas en RDS PostgreSQL + pgvector. La API principal sigue siendo la fuente de verdad. Esta tabla contiene datos derivados para busqueda semantica y recomendacion de posts. ## Tabla ```sql CREATE EXTENSION IF NOT EXISTS vector; CREATE TABLE IF NOT EXISTS post_embeddings ( external_id TEXT PRIMARY KEY, document TEXT NOT NULL, metadata JSONB NOT NULL DEFAULT '{}'::jsonb, embedding VECTOR(300) NOT NULL, content_hash TEXT NOT NULL, embedding_model TEXT NOT NULL, embedding_version TEXT NOT NULL, is_active BOOLEAN NOT NULL DEFAULT true, updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); ``` `VECTOR(300)` corresponde al modelo preentrenado `facebook/fasttext-es-vectors` usado por `FastTextEmbeddingProvider`. ## Columnas | Columna | Tipo | Descripcion | |---|---|---| | `external_id` | `TEXT` | ID del post en la API principal. | | `document` | `TEXT` | Texto construido para generar el embedding. | | `metadata` | `JSONB` | Datos estructurados utiles para filtros y respuesta. | | `embedding` | `VECTOR(300)` | Promedio normalizado de embeddings FastText del `document`. | | `content_hash` | `TEXT` | SHA-256 del contenido y la configuracion/version del embedding. | | `embedding_model` | `TEXT` | Nombre del modelo usado para generar embeddings. | | `embedding_version` | `TEXT` | Version logica del embedding. | | `is_active` | `BOOLEAN` | Estado derivado desde la API principal. | | `updated_at` | `TIMESTAMPTZ` | Fecha de ultima sincronizacion. | ## Metadata JSONB El job guarda estos campos en `metadata` cuando existen: ```json { "title": "Titulo del post", "city": "Tuxtla Gutierrez", "state": "Chiapas", "source": "internal", "tags": "cafe,amigos", "is_active": true } ``` ## Document El campo `document` se construye concatenando, cuando existan: ```text title city state source tags text/content/description/body ``` Ejemplo: ```text Plan de cafe Tuxtla Gutierrez Chiapas internal cafe amigos Una publicacion para salir por cafe ``` ## Content Hash `content_hash` se calcula con SHA-256 sobre el hash del contenido mas: ```json { "source_content_hash": "...", "embedding_model": "facebook/fasttext-es-vectors", "embedding_version": "common-crawl-300-v1", "embedding_dimension": 300 } ``` Si el hash no cambia, el job omite regenerar embedding. ## Funciones Requeridas La API NLP usa: ```sql match_posts(query_embedding VECTOR(300), match_count INTEGER, filters JSONB) ``` Los jobs usan: ```sql upsert_post_embedding( p_external_id TEXT, p_document TEXT, p_metadata JSONB, p_embedding VECTOR(300), p_content_hash TEXT, p_embedding_model TEXT, p_embedding_version TEXT, p_is_active BOOLEAN ) ``` El SQL completo de referencia esta en: ```text sql/aws_pgvector_contract.sql ```