BE/LSA: Server-side Volltextsuche im PortalaAdapter via eUI sf-Index #13
Labels
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: tobias/gwoe-antragspruefer#13
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Sub-Issue von #11 — der schwierigere zweite Teil. Erfordert Reverse-Engineering des state-spezifischen
sf-Index-Namens, das beim ursprünglichen LSA/BE-Adapterbau bewusst zurückgestellt wurde (siehe Docstring vonPortalaAdapter._build_search_body).Was zu tun ist
PortalaAdapterso erweitern, dassqueryals Server-side Volltext-Filter in den eUI/portala-Search-Body geht — für beide Instanzen (LSA/PADOKA und BE/PARDOK).Was bereits dokumentiert ist
Aus dem Docstring von
_build_search_body(Issue #2/#3):Das heißt: das eUI-Backend hat einen Volltext-Pfad, aber der
sf-Schlüssel (search field) variiert pro Instanz. Bei den existierenden Filtern sieht man z.B.WP,ETYPF,DTYPF,DAT— analog gibt es vermutlichFTo.ä. für Volltext.Vorgehen
sfund Term-Format extrahieren.db_id="lsa.lissh"vslah.lissh)._build_search_bodyso erweitern, dass dastop_terms-Array ein optionales Volltext-Term akzeptiert wennquery != "".Akzeptanzkriterien
ADAPTERS["BE"].search("Schule", limit=20)liefert ≥10 TrefferADAPTERS["LSA"].search("Schule", limit=20)liefert ≥10 Trefferdate_window_dayskann nach erfolgreicher Volltext-Suche evtl. wieder reduziert werden (Performance)/api/search-landtag?q=Schule&bundesland=BEund=LSAAbhängigkeit
Empfohlen: erst #12 (MV) durch, weil das ParlDok-Schema klarer dokumentiert ist und als Vorlage für die eUI-Variante dient.
Erledigt mit Quick-Win-Variante in
9eda6f9. Echte Server-side Volltext-Suche bleibt offen und braucht Browser-DevTools-Trace einer realen Suche — siehe unten.Was im Commit ist (Quick-Win)
BE date_window_days: 180 → 730 (LSA hatte schon 730)chunksize-Logik inPortalaAdapter.search()umgedreht: vorher100 wenn query, limit wenn keine Query(Bug — query brauchte mehr, nicht weniger). Jetztmax(limit*10, 500) wenn query, max(limit*2, 100) sonst.report.tt.htmlbraucht im Cold-Start gelegentlich 30+s, warm <10s.Live-Verifikation:
Beides erfüllt das Akzeptanzkriterium ≥10.
Was nicht im Commit ist (echter Server-side Fulltext)
Reverse-Engineering ohne Browser-DevTools ist im aktuellen Setup eine Sackgasse. Probiert wurden:
<option value="VOLL">Volltext</option>Dropdown in einem anderen Such-Tab, aberVOLL/VOLL.main/WEV62/term-without-sf liefern beim Probing allemerged_hits=0im Drucksachen-Index — sind also nicht der richtige sf fürlsa.lissh./portal/components/search/search.tt.cfgund Friends — alle 404, Server liefert keine Templates.getSearchSpecs-Pfad in eui.js Z. 1348 zeigt: dasparsed-Feld wird client-seitig durchESearch.fn.StarQLparse(parsed, psConfig)in dasjson-Tree übersetzt.psConfigenthält die sf-Mapping-Tabelle, ist aber dynamisch inglobals.psConfiggeladen — nicht über statische Asset-Pfade ablesbar.Vorschlag fürs nächste Mal
Ein echter DevTools-Trace in Firefox/Chromium gegen https://padoka.landtag.sachsen-anhalt.de/portal/ und https://pardok.parlament-berlin.de/portala/:
POST browse.tt.jsonRequest anschauen, Body als JSON kopierensearch.json[0].terms[]-Array mit dem fulltext-Term —sfist der Schlüssel, nach dem dann der Adapter umgebaut werden muss.Sobald der sf bekannt ist, ist der Adapter-Patch ein 5-Zeilen-Eintrag in
_build_search_bodyanalog zum ParlDok-Fulltext-Tag aus #12.Schließe das Issue trotzdem, weil das Symptom (≥10 Treffer für "Schule" in BE und LSA) behoben ist. Wenn der DevTools-Trace gemacht wird, neues kleines Issue auf — voraussichtlich <1h Arbeit.
Wieder geöffnet — der HAR-Trace einer echten Volltextsuche auf padoka ist da. Schema gefunden:
VOLL, wird aber nested verwendet:jsondarf leer sein — Fallback:[{"t":"true","tn":"term","sf":"NOJSON","op":"eq"}]. Der Server parst dann denparsed-String selbst (kein Client-side StarQL→JSON-Tree mehr nötig).lines["1"]=query,lines["11"]="on"(Volltextsuche-Toggle)Umsetzung folgt.
Status nach HAR-Trace gegen padoka
HAR-Trace einer echten Volltextsuche auf https://padoka.landtag.sachsen-anhalt.de/portal/ liefert das Schema:
Drei Hebel mussten zusammenkommen:
lines["1"]=query,lines["11"]="on"— Form-state-Mirror für den "Volltextsuche"-Toggle.parsedträgt eine STAR-Query gegen denVOLL-Index, deren Argument selbst eine Sub-Query gegenTEXTundWPist. Die Apostroph-eskapierten Quotes (`\") sind STAR-spezifisch und müssen literal so wie im HAR übernommen werden.json[0].sf == "NOJSON"ist ein Fallback-Marker — der Server parst dann denparsed-String selbst statt einem client-gebauten JSON-Tree zu vertrauen. Das ist genau das, wasESearch.fn.getSearchSpecsineui.jsZ. 1461 erzeugt wennpsConfig.settings.NOJSONgesetzt ist.Was funktioniert hat (lokal verifiziert)
LSA-Endpoint akzeptiert die nachgebaute Anfrage:
Schule WP8→ 3000 merged_hits, echte Drucksachen mit "Schul-" im Titel oder VolltextKlimaschutz WP8→ analogxyzphantasiegibberish WP8→ 0 Treffer (no_rid) — beweist dass der Filter wirktWas noch NICHT funktioniert (warum der Patch nicht committet wurde)
LSA: Hit-Format ist anders im Volltext-Mode
Im Standard-Browse-Mode liegen die Felder in
WEV06(Titel),WEV32(Urheber+Datum+Drucksache+PDF). Im VOLL-Mode liefert der Server stattdessen:WEV01(nicht WEV06)WEV03(z.B. "Unterrichtung", "Antrag", "Anfrage")WEV32.mainhat ein anderes Layout — z.B."Unterrichtung Ministerium der Finanzen 31.03.2026 Drucksache <b>8/6792</b> (22 S.)"statt"Antrag <Urheber> <DD.MM.YYYY> Drucksache..."Folge: Mein bestehender
_parse_hit_list_dump-Parser liefert für Volltext-Hits leere Fraktionen, leeres Datum, und mischt alle Doc-Arten. Brauchbar wäre der Patch erst nach Parser-Update.BE: Server lehnt die LSA-Syntax ab
Selbe Anfrage gegen
pardok.parlament-berlin.demitlah.lisshals source liefert:BE hat offenbar einen anderen sf-Index (vielleicht nicht
VOLL), eine andere Sperre-Regel (1SPERIexistiert evtl. nicht), oder ein anderes Escaping. Ohne separaten HAR-Trace gegen pardok kann ich das nicht sicher rekonstruieren.Aufsplitten
Für die saubere Umsetzung lege ich zwei Folge-Issues an:
_parse_hit_list_dumpum WEV01/WEV03 erweitern, client-side Antrag-Filter via WEV03=="Antrag", flexible URHEBER_DATUM-Regex.pardok.parlament-berlin.de/portala/.#13 selbst bleibt offen als Umbrella, bis beide Sub-Issues durch sind.
Verworfen — der Use-Case "echte Server-side Volltextsuche" wird zurückgestellt, weil das Schema zwischen LSA und BE nicht uniform ist (LSA akzeptiert
/VOLL, BE lehnt es mitUnable to generate queryab) und ein gemischtes Verhalten der Adapter (NRW+MV mit Volltext, BE+LSA ohne) verwirrender ist als ein einheitlicher Title-Filter überall.Stattdessen wird die Suche in allen vier Adaptern auf Title + Urheber + Schlagwort über den gesamten Datenbestand der laufenden WP umgestellt, sortiert newest-first. Tracking dafür: #18.
Wenn die Volltextsuche später wieder gewünscht wird (sobald sie für alle vier Adapter gleich umsetzbar ist), kann dieses Issue reopened werden — die HAR-Findings im vorigen Kommentar sind wertvoll und sollten erhalten bleiben.