CQL, SRU en server-side filtering: de snelle route naar officielebekendmakingen.nl

Dankzij real-time filtering bij de bron kunnen onderzoeksjournalisten, burgers en parlementariërs binnen seconden de juiste passages vinden tussen miljoenen bekendmakingen. En dat zonder concessies aan actualiteit.

Of je nu zoekt naar aanwijzingen van beleidswijziging, besluitvorming rond gevoelige dossiers of juridische gronden: de combinatie van UniversalSQL en de KOOP API’s biedt grip op het informatie-overaanbod.

In dit topic leer je hoe Invantive UniversalSQL de toegang tot KOOP-datasets zoals Officiele Publicaties automatisch enorm versnelt. De werking wordt geillustreerd aan de hand van SQL-statements in het Invantive Query Tool, maar geldt ook voor bijvoorbeeld Power BI, Excel en SQL Server Management Studio.

Performance

De performance van https://repository.overheid.nl is circa 100 rijen per seconde bij een paginagrootte van 1.000 rijen.

De driver werkt - net zoals alle andere Invantive-drivers - op basis van real-time queries voor maximale actualiteit. Met richting 6 miljoen bekendmakingen is het niet realistisch om elke opvraging 16 uur of langer te laten duren.

Gelukkig biedt de Invantive UniversalSQL-engine de mogelijkheid om filters door te geven, het zogenaamde “server-side filtering”.

En gelukkig ondersteunen de KOOP-databronnen via CQL als onderdeel van SRU 2.0 ook het gebruik van filters in een aantal scenario’s.

Voorbeeld Performancewinst Datumbereik

De volgende query vraagt alle mutaties van de afgelopen dagen op:

select *
from   entries
where  modified >= to_date('20250614', 'YYYYMMDD')
limit  50

De Invantive-engine gebruikt hiervoor een CQL-query op SRU:

https://repository.overheid.nl:443/sru?...&query=(c.product-area==officielepublicaties+and+(dt.modified>=2025-06-14))

welke in enkele seconden de eerste 50 mutaties van de dag geeft:

Een variant op deze query is:

select modified, *
from   entries
where  modified > to_date('20250614', 'YYYYMMDD')
limit  50

met de CQL-query op SRU:

https://repository.overheid.nl:443/sru?...&query=(c.product-area==officielepublicaties+and+(dt.modified>=2025-06-15))

De query levert geen resultaten. Gelukkig; dit zou kunnen neerkomen op anti-dateren. Echter, de CQL-query laat zien dat een > herschreven wordt naar een >= binnen CQL. De metadata van SRU geeft namelijk aan dat er geen > ondersteund wordt op dit datumveld. De prestaties blijven goed door het om te zetten in een filter dat tenminste dezelfde rijen teruggeeft.

Voorbeeld Snel Zoeken op Deeltekst

Het is ook mogelijk om efficient te zoeken op bijvoorbeeld een deeltekst zoals dat de titel begint met ‘uitschrijving’ (in kleine letters):

select modified, *
from   entries
where  title like 'uitschrijving%'
limit  50

De SQL-engine genereert hiervoor de opvraging:

https://repository.overheid.nl/sru?...&query=%28c.product-area%3D%3Dofficielepublicaties+and+%28cql.textAndIndexes+%3D+uitschrijving%29%29

Deze opvraging maakt gebruik van cql.textAndIndexes omdat de = en == operator niet op teksten zoeken, maar op zoektermen. Zoeken met = op de zoekterm uitschrijving in de titel levert geen hits op voor een rij met de titel uitschrijvingen.

cql.textAndIndexes geeft aan dat ergens in de rij of gekoppelde (PDF-)documenten het woord uitschrijving dient voor te komen. De KOOP API-server is goed in staat om een dergelijke vraag erg snel te beantwoorden. Mogelijk gebruikt deze technologie zoals ElasticSearch voor het snel doorzoeken van grote hoeveelheden data.

Uiteraard komen ook rijen terug die uitschrijving in een gekoppeld PDF-document bevatten, of in een ander veld dan title. Door client-side filtering worden deze alsnog achterwege gelaten in de resultaten.

Snel Zoeken op Meerdere Criteria

De optimalisaties die Invantive UniversalSQL toepast gaan verder dan enkel filteren op een veld. Om te komen tot constanten om door te geven worden expressies zoveel mogelijk geevalueerd en vereenvoudigd zodat bijvoorbeeld trunc(sysdateutc) ook doorgezet wordt naar de KOOP API-server.

De engine geeft ook meerdere criteria door zoals blijkt uit:

select modified, *
from   entries
where  title like 'uitschrijving%'
and    modified >= to_date('20250601', 'YYYYMMDD')
limit  50

met de bijbehorende CQL-query:

https://repository.overheid.nl/sru?...&query=(c.product-area==officielepublicaties+and+(cql.textAndIndexes+=+uitschrijving+and+dt.modified>=2025-06-01))

die na enkele seconden al de dataset teruggeeft: