Beschreibung:
Der /api/geometries-Endpoint liefert aktuell für jedes Asset den gesamten data-JSON-Blob aus dem ES-Index swissgeol_asset_asset zurück. Dieses Feld enthält Titel, Kontakte, TopicCodes, Geometrien etc. – der Endpoint benötigt davon aber nur:
- id (AssetId)
- isPublic (boolean)
- geometries[].centroid (Koordinaten)
- geometries[].id (GeometryId)
- geometries[].type (GeometryType)
Da die Daten als einzelner JSON-String ist (AssetJSON) geladen werden, kann ES kein _source-Filtering darauf anwenden. Es muss immer der gesamte Blob (~1–3 KB pro Asset) geladen und im Backend geparst werden.
Umsetzung:
- ES-Mapping erweitern (swissgeol_asset_asset.json):
- Neues nested Feld geometryData mit Subfeldern: - id (type: integer)
- type (type: keyword)
- centroidX (type: integer)
- centroidY (type: integer)
- Asset-Writer anpassen (asset-search-writer.service.ts → mapAssetToElastic()):
- geometryData aus den Geometrien (bereits im gleichen Promise.all geladen) befüllen
- Geometries-Controller umschreiben:
- Direkt ES-Client verwenden statt AssetSearchService.search() - Oder eigenen Service dafür erstellen
- Query mit _source: ['id', 'isPublic', 'geometryData'] – nur die 3 Felder laden
- hasFiles-Filter als term-Clause beibehalten
- Einmaliges Re-Indexing aller bestehenden Assets erforderlich (via bestehenden Sync-Mechanismus
Erwarteter Effekt:
- Deutlich reduziertes Datenvolumen pro ES-Antwort (~50–100 Bytes statt 1–3 KB pro Asset)
- Kein JSON-Parsing des data-Blobs im Backend
- Schnellere Response-Zeit des Endpoints, weniger Speicherverbrauch
Hinweis: Diese Optimierung wurde bereits prototypisch implementiert und funktioniert:
https://github.com/swisstopo/swissgeol-assets-suite/tree/poc%2Fadd-separate-geometries-index-on-assets
Muss unbedingt auf Herz und Nieren geprüft werden.
Sie wurde nur zurückgestellt, da der grösste Performance-Gewinn für Dokumente bereits durch den Wechsel vom File-Index auf den Asset-Index erzielt wurde.
Beschreibung:
Der
/api/geometries-Endpoint liefert aktuell für jedes Asset den gesamten data-JSON-Blob aus dem ES-Index swissgeol_asset_asset zurück. Dieses Feld enthält Titel, Kontakte, TopicCodes, Geometrien etc. – der Endpoint benötigt davon aber nur:Da die Daten als einzelner JSON-String ist (AssetJSON) geladen werden, kann ES kein _source-Filtering darauf anwenden. Es muss immer der gesamte Blob (~1–3 KB pro Asset) geladen und im Backend geparst werden.
Umsetzung:
Erwarteter Effekt:
Hinweis: Diese Optimierung wurde bereits prototypisch implementiert und funktioniert:
https://github.com/swisstopo/swissgeol-assets-suite/tree/poc%2Fadd-separate-geometries-index-on-assets
Muss unbedingt auf Herz und Nieren geprüft werden.
Sie wurde nur zurückgestellt, da der grösste Performance-Gewinn für Dokumente bereits durch den Wechsel vom File-Index auf den Asset-Index erzielt wurde.