Showing
2 changed files
with
64 additions
and
34 deletions
| ... | @@ -7,7 +7,24 @@ Buscador instantáneo con Fuse.js en cliente. Busca en clasificadores presupuest | ... | @@ -7,7 +7,24 @@ Buscador instantáneo con Fuse.js en cliente. Busca en clasificadores presupuest |
| 7 | 7 | ||
| 8 | ### Motor de búsqueda | 8 | ### Motor de búsqueda |
| 9 | - **Tecnología**: Fuse.js (cliente) | 9 | - **Tecnología**: Fuse.js (cliente) |
| 10 | -- **Razón**: ~2,000-4,000 registros totales, cabe en memoria, búsqueda instantánea sin latencia | 10 | +- **Razón**: ~1,000 registros totales (~600 entidades + ~450 objetos), cabe en memoria, búsqueda instantánea sin latencia |
| 11 | + | ||
| 12 | +### Configuración Fuse.js | ||
| 13 | +```javascript | ||
| 14 | +const fuseOptions = { | ||
| 15 | + keys: [ | ||
| 16 | + { name: 'nombre_normalizado', weight: 0.6 }, | ||
| 17 | + { name: 'sigla_normalizada', weight: 0.2 }, | ||
| 18 | + { name: 'codigo_normalizado', weight: 0.2 } | ||
| 19 | + ], | ||
| 20 | + threshold: 0.4, | ||
| 21 | + distance: 100, | ||
| 22 | + includeScore: true, | ||
| 23 | + includeMatches: true, | ||
| 24 | + minMatchCharLength: 2, | ||
| 25 | + ignoreLocation: true | ||
| 26 | +}; | ||
| 27 | +``` | ||
| 11 | 28 | ||
| 12 | ### Tolerancia a errores | 29 | ### Tolerancia a errores |
| 13 | - Normalización de acentos ("andres" → "andrés") | 30 | - Normalización de acentos ("andres" → "andrés") |
| ... | @@ -24,12 +41,13 @@ Buscador instantáneo con Fuse.js en cliente. Busca en clasificadores presupuest | ... | @@ -24,12 +41,13 @@ Buscador instantáneo con Fuse.js en cliente. Busca en clasificadores presupuest |
| 24 | 41 | ||
| 25 | ## Estructura del Índice | 42 | ## Estructura del Índice |
| 26 | 43 | ||
| 27 | -### Índice unificado (futuro) | 44 | +### Índice unificado (implementado) |
| 28 | Todos los clasificadores en un solo array con `tipo`: | 45 | Todos los clasificadores en un solo array con `tipo`: |
| 29 | 46 | ||
| 30 | ```javascript | 47 | ```javascript |
| 31 | -// src/lib/data/index.js | 48 | +// src/lib/services/search.js |
| 32 | -const indice = [ | 49 | +const searchData = [ |
| 50 | + // Entidades | ||
| 33 | { | 51 | { |
| 34 | tipo: 'entidad', | 52 | tipo: 'entidad', |
| 35 | codigo: 139, | 53 | codigo: 139, |
| ... | @@ -37,22 +55,28 @@ const indice = [ | ... | @@ -37,22 +55,28 @@ const indice = [ |
| 37 | sigla: 'UMSA', | 55 | sigla: 'UMSA', |
| 38 | contexto: 'Universidades Públicas', | 56 | contexto: 'Universidades Públicas', |
| 39 | años: 20, | 57 | años: 20, |
| 40 | - // campos normalizados para búsqueda | 58 | + nombre_normalizado: 'universidad mayor de san andres', |
| 41 | - _nombre_normalizado: 'universidad mayor de san andres', | 59 | + sigla_normalizada: 'umsa', |
| 42 | - _sigla_normalizada: 'umsa' | 60 | + codigo_normalizado: '139' |
| 43 | }, | 61 | }, |
| 62 | + // Objetos de gasto | ||
| 44 | { | 63 | { |
| 45 | tipo: 'objeto_gasto', | 64 | tipo: 'objeto_gasto', |
| 46 | - codigo: 25100, | 65 | + codigo: '25100', |
| 47 | nombre: 'Pasajes', | 66 | nombre: 'Pasajes', |
| 48 | - contexto: 'Servicios', | 67 | + sigla: null, |
| 49 | - // ... | 68 | + contexto: 'Objeto del Gasto · Partida', |
| 69 | + nivel: 'partida', | ||
| 70 | + nombre_normalizado: 'pasajes', | ||
| 71 | + sigla_normalizada: '', | ||
| 72 | + codigo_normalizado: '25100' | ||
| 50 | } | 73 | } |
| 51 | ] | 74 | ] |
| 52 | ``` | 75 | ``` |
| 53 | 76 | ||
| 54 | -### Por ahora (MVP) | 77 | +### Fuentes de datos |
| 55 | -Solo clasificador de entidades (`clas_institucional`). | 78 | +- **Entidades**: tabla `ppto.clas_institucional` |
| 79 | +- **Objetos de gasto**: tabla `ppto.clas_objetos` | ||
| 56 | 80 | ||
| 57 | ## Columnas de Búsqueda | 81 | ## Columnas de Búsqueda |
| 58 | 82 | ||
| ... | @@ -65,12 +89,12 @@ Solo clasificador de entidades (`clas_institucional`). | ... | @@ -65,12 +89,12 @@ Solo clasificador de entidades (`clas_institucional`). |
| 65 | | `n_gestiones` | ✗ | ✓ "X años de datos" | | 89 | | `n_gestiones` | ✗ | ✓ "X años de datos" | |
| 66 | | `entidad` | ✗ | para URL | | 90 | | `entidad` | ✗ | para URL | |
| 67 | 91 | ||
| 68 | -### Objetos de gasto (futuro) | 92 | +### Objetos de gasto (clas_objetos) |
| 69 | | Columna | Buscar | Mostrar | | 93 | | Columna | Buscar | Mostrar | |
| 70 | |---------|--------|---------| | 94 | |---------|--------|---------| |
| 71 | | `desc_objeto` | ✓ | ✓ nombre principal | | 95 | | `desc_objeto` | ✓ | ✓ nombre principal | |
| 72 | -| `codigo_objeto` | ✓ | ✓ código | | 96 | +| `objeto` | ✓ | ✓ código (monospace) | |
| 73 | -| `desc_partida` | ✗ | ✓ contexto | | 97 | +| `nivel` | ✗ | ✓ contexto ("Objeto del Gasto · Partida") | |
| 74 | 98 | ||
| 75 | ## Flujo de Búsqueda | 99 | ## Flujo de Búsqueda |
| 76 | 100 | ||
| ... | @@ -92,7 +116,7 @@ Solo clasificador de entidades (`clas_institucional`). | ... | @@ -92,7 +116,7 @@ Solo clasificador de entidades (`clas_institucional`). |
| 92 | 116 | ||
| 93 | ``` | 117 | ``` |
| 94 | /entidad/[codigo] → /entidad/139 | 118 | /entidad/[codigo] → /entidad/139 |
| 95 | -/gasto/[codigo] → /gasto/25100 (futuro) | 119 | +/objeto/[codigo] → /objeto/25100 |
| 96 | /area/[codigo] → /area/1.1.4 (futuro, opcional) | 120 | /area/[codigo] → /area/1.1.4 (futuro, opcional) |
| 97 | ``` | 121 | ``` |
| 98 | 122 | ||
| ... | @@ -100,18 +124,22 @@ Solo clasificador de entidades (`clas_institucional`). | ... | @@ -100,18 +124,22 @@ Solo clasificador de entidades (`clas_institucional`). |
| 100 | 124 | ||
| 101 | ``` | 125 | ``` |
| 102 | ┌─────────────────────────────────────────────────────┐ | 126 | ┌─────────────────────────────────────────────────────┐ |
| 103 | -│ 🔍 [buscar entidad, objeto de gasto...] │ | 127 | +│ 🔍 [Buscar entidad u objeto de gasto...] │ |
| 104 | ├─────────────────────────────────────────────────────┤ | 128 | ├─────────────────────────────────────────────────────┤ |
| 105 | -│ Universidad Mayor De San Andrés (UMSA) │ | 129 | +│ Universidad Mayor De San Andrés (UMSA) │ ← Entidad |
| 106 | -│ Universidades Públicas · 20 años │ | 130 | +│ Universidades Públicas │ |
| 107 | ├─────────────────────────────────────────────────────┤ | 131 | ├─────────────────────────────────────────────────────┤ |
| 108 | -│ Universidad Pública De El Alto (UPEA) │ | 132 | +│ 25100 Pasajes │ ← Objeto de gasto |
| 109 | -│ Universidades Públicas · 21 años │ | 133 | +│ Objeto del Gasto · Partida │ |
| 110 | ├─────────────────────────────────────────────────────┤ | 134 | ├─────────────────────────────────────────────────────┤ |
| 111 | │ ... │ | 135 | │ ... │ |
| 112 | └─────────────────────────────────────────────────────┘ | 136 | └─────────────────────────────────────────────────────┘ |
| 113 | ``` | 137 | ``` |
| 114 | 138 | ||
| 139 | +### Diferencias visuales | ||
| 140 | +- **Entidades**: Nombre + (sigla) en primera línea | ||
| 141 | +- **Objetos de gasto**: Código (monospace) + Nombre en primera línea | ||
| 142 | + | ||
| 115 | ## Estados del Buscador | 143 | ## Estados del Buscador |
| 116 | 144 | ||
| 117 | | Estado | Qué mostrar | | 145 | | Estado | Qué mostrar | |
| ... | @@ -143,14 +171,19 @@ src/lib/ | ... | @@ -143,14 +171,19 @@ src/lib/ |
| 143 | └── index.js ← Carga y construcción del índice | 171 | └── index.js ← Carga y construcción del índice |
| 144 | ``` | 172 | ``` |
| 145 | 173 | ||
| 174 | +## Estado de Implementación | ||
| 175 | + | ||
| 176 | +| Clasificador | Estado | Tabla | | ||
| 177 | +|--------------|--------|-------| | ||
| 178 | +| Entidades | ✅ Implementado | `ppto.clas_institucional` | | ||
| 179 | +| Objetos de gasto | ✅ Implementado | `ppto.clas_objetos` | | ||
| 180 | +| Fuente de financiamiento | ⏳ Pendiente | - | | ||
| 181 | +| Geográfico | ⏳ Pendiente | - | | ||
| 182 | + | ||
| 146 | ## Trabajo Futuro | 183 | ## Trabajo Futuro |
| 147 | 184 | ||
| 148 | -### Índice normalizado | 185 | +### Índice pre-computado |
| 149 | -Cuando haya múltiples clasificadores, crear un proceso que: | 186 | +Posibilidad de pre-computar el índice en servidor y servir como JSON estático para mejorar tiempo de carga inicial. |
| 150 | -1. Descargue todos los clasificadores | ||
| 151 | -2. Normalice campos de búsqueda (acentos, minúsculas) | ||
| 152 | -3. Genere un índice unificado optimizado | ||
| 153 | -4. Posiblemente pre-computar en servidor y servir como JSON estático | ||
| 154 | 187 | ||
| 155 | ### Migración a servidor | 188 | ### Migración a servidor |
| 156 | Si el índice supera ~20,000 registros: | 189 | Si el índice supera ~20,000 registros: | ... | ... |
| ... | @@ -7,10 +7,7 @@ | ... | @@ -7,10 +7,7 @@ |
| 7 | </svelte:head> | 7 | </svelte:head> |
| 8 | 8 | ||
| 9 | <div class="max-w-4xl mx-auto p-4"> | 9 | <div class="max-w-4xl mx-auto p-4"> |
| 10 | - <h1 class="text-2xl mb-2">Presupuesto Público de Bolivia</h1> | 10 | + <h1 class="text-2xl mb-6">Presupuesto Público de Bolivia</h1> |
| 11 | - <p class="mb-6 text-gray-600"> | ||
| 12 | - 20 años de datos fiscales · 600+ entidades · Actualización diaria | ||
| 13 | - </p> | ||
| 14 | 11 | ||
| 15 | <div class="mb-8"> | 12 | <div class="mb-8"> |
| 16 | <SearchBox /> | 13 | <SearchBox /> |
| ... | @@ -21,9 +18,9 @@ | ... | @@ -21,9 +18,9 @@ |
| 21 | <strong>Clasificadores</strong> | 18 | <strong>Clasificadores</strong> |
| 22 | <p class="text-gray-600">Navegar por instituciones, objetos de gasto, etc.</p> | 19 | <p class="text-gray-600">Navegar por instituciones, objetos de gasto, etc.</p> |
| 23 | </a> | 20 | </a> |
| 24 | - <div class="p-4 border rounded opacity-50"> | 21 | + <a href="/historias" class="p-4 border rounded hover:bg-gray-50"> |
| 25 | <strong>Historias</strong> | 22 | <strong>Historias</strong> |
| 26 | - <p class="text-gray-600">Próximamente</p> | 23 | + <p class="text-gray-600">Análisis y visualizaciones del gasto público</p> |
| 27 | - </div> | 24 | + </a> |
| 28 | </div> | 25 | </div> |
| 29 | </div> | 26 | </div> | ... | ... |
-
Please register or login to post a comment