Contesto
L'API REST del RNDT (/rest/metadata/search) permette di filtrare i metadati con una query string Lucene (q=campo:valore), ma non permette di aggregarli: non c'è modo di ottenere in una sola chiamata, ad esempio, "quanti record per ciascuna licenza / ente / tema INSPIRE / tipo di risorsa".
Il backend è Elasticsearch (Esri Geoportal Server). Lo si vede dalla forma delle risposte, che espongono i campi tipici di un documento ES:
{ "_index": "...", "_id": "...", "_version": ..., "_seq_no": ..., "_primary_term": ..., "found": true, "_source": { ... } }
e dalla convenzione di mapping dinamico dei campi (_s keyword, _dt data, _txt testo, _i intero, _b booleano, _geo/_pt geometrie).
Elasticsearch supporta nativamente le aggregations (il body aggs), ma l'API pubblica del RNDT espone solo i parametri di filtro (q, bbox, time, modified, type, sort, start, num, …) e nessun parametro/endpoint di aggregazione. Il motore saprebbe aggregare, ma l'API non lo consente.
Cosa chiediamo
Esporre una capacità di aggregazione/faceting sull'endpoint di ricerca. Possibili strade, in ordine di preferenza:
- Un parametro o body di aggregazione su
/rest/metadata/search che inoltri un terms aggregation di Elasticsearch su un campo indicizzato (es. aggs=isOpendata,EnteResponsabile_s,INSPIRETheme_s).
- In alternativa, esporre le facet tramite l'endpoint OGC API - Records già presente (
/ogcrecords).
- In subordine, anche solo un endpoint read-only di sola lettura per i
terms aggregation su una whitelist di campi sicuri.
Perché serve (casi d'uso)
Oggi, per rispondere a domande di sintesi sul catalogo, l'unica via è scaricare tutti i ~23.500 record e aggregarli in locale. Con le aggregazioni basterebbe una chiamata. Esempi concreti:
- Distribuzione delle licenze (
isOpendata): quante risorse per CC BY 4.0, IODL 2.0, ecc. Utile per monitorare l'apertura reale dei dati territoriali e — non secondario — per far emergere la disomogeneità del campo (oggi convivono CC BY 4.0, CCBY, Licenza CC-BY 4.0, paragrafi di disclaimer…), un problema di qualità che le aggregazioni renderebbero subito visibile.
- Record per ente (
EnteResponsabile_s / apiso_OrganizationName_txt): chi pubblica di più, copertura per amministrazione.
- Record per tema INSPIRE (
INSPIRETheme_s) e per categoria ISO 19115.
- Record per tipo (
apiso_Type_s: dataset/service/series) e per ambito territoriale.
Tutte statistiche utili a cittadini, PA e riusatori per capire cosa contiene il RNDT, senza martellare l'API con migliaia di richieste.
Workaround attuale (e suoi limiti)
Si può emulare un facet emettendo una query per ciascun valore e leggendo total:
# es. via openrndt
for v in dataset service series; do
openrndt --format json search --q "apiso_Type_s:$v" --num 1 | jq '.total'
done
Funziona solo per campi enumerati con valori già noti. È inutile per scoprire i valori distinti (devi già conoscerli) ed è impraticabile su campi a testo libero come le licenze. Da qui la richiesta di abilitare le aggregazioni native.
Issue di tracciamento lato openrndt. Il testo sopra è pensato per essere inoltrato a chi gestisce il RNDT (AgID / geodati.gov.it).
Contesto
L'API REST del RNDT (
/rest/metadata/search) permette di filtrare i metadati con una query string Lucene (q=campo:valore), ma non permette di aggregarli: non c'è modo di ottenere in una sola chiamata, ad esempio, "quanti record per ciascuna licenza / ente / tema INSPIRE / tipo di risorsa".Il backend è Elasticsearch (Esri Geoportal Server). Lo si vede dalla forma delle risposte, che espongono i campi tipici di un documento ES:
{ "_index": "...", "_id": "...", "_version": ..., "_seq_no": ..., "_primary_term": ..., "found": true, "_source": { ... } }e dalla convenzione di mapping dinamico dei campi (
_skeyword,_dtdata,_txttesto,_iintero,_bbooleano,_geo/_ptgeometrie).Elasticsearch supporta nativamente le aggregations (il body
aggs), ma l'API pubblica del RNDT espone solo i parametri di filtro (q, bbox, time, modified, type, sort, start, num, …) e nessun parametro/endpoint di aggregazione. Il motore saprebbe aggregare, ma l'API non lo consente.Cosa chiediamo
Esporre una capacità di aggregazione/faceting sull'endpoint di ricerca. Possibili strade, in ordine di preferenza:
/rest/metadata/searchche inoltri untermsaggregation di Elasticsearch su un campo indicizzato (es.aggs=isOpendata,EnteResponsabile_s,INSPIRETheme_s)./ogcrecords).termsaggregation su una whitelist di campi sicuri.Perché serve (casi d'uso)
Oggi, per rispondere a domande di sintesi sul catalogo, l'unica via è scaricare tutti i ~23.500 record e aggregarli in locale. Con le aggregazioni basterebbe una chiamata. Esempi concreti:
isOpendata): quante risorse perCC BY 4.0,IODL 2.0, ecc. Utile per monitorare l'apertura reale dei dati territoriali e — non secondario — per far emergere la disomogeneità del campo (oggi convivonoCC BY 4.0,CCBY,Licenza CC-BY 4.0, paragrafi di disclaimer…), un problema di qualità che le aggregazioni renderebbero subito visibile.EnteResponsabile_s/apiso_OrganizationName_txt): chi pubblica di più, copertura per amministrazione.INSPIRETheme_s) e per categoria ISO 19115.apiso_Type_s: dataset/service/series) e per ambito territoriale.Tutte statistiche utili a cittadini, PA e riusatori per capire cosa contiene il RNDT, senza martellare l'API con migliaia di richieste.
Workaround attuale (e suoi limiti)
Si può emulare un facet emettendo una query per ciascun valore e leggendo
total:Funziona solo per campi enumerati con valori già noti. È inutile per scoprire i valori distinti (devi già conoscerli) ed è impraticabile su campi a testo libero come le licenze. Da qui la richiesta di abilitare le aggregazioni native.
Issue di tracciamento lato
openrndt. Il testo sopra è pensato per essere inoltrato a chi gestisce il RNDT (AgID / geodati.gov.it).