Rohe Feed-Antworten ablegen und Parser erweitern
Der Abruf warf bisher fast alles weg, was im XML stand. Neu ausgewertet werden Kategorien (<category>, dc:subject, Atom-term), content:encoded zusaetzlich zur kurzen description, Medien-URLs aus enclosure und Media RSS, Verweise aus dem Teaser-HTML und die Position im Feed beim ersten Sehen. Die Kategorien sind fuer Stufe 2 der wertvollste Posten: vom Verlag selbst vergebene Themenlabel, brauchbar als Vorfilter und als Prompt-Kontext. Gemessen an zwoelf Quellen tragen 189 von 814 Items Kategorien, 315 einen laengeren Volltext, 430 Medien. Ausserdem landen die rohen Antwortbytes gezippt in feed_abrufe, dedupliziert ueber ihren sha256. Der Parser wird sich weiter aendern; nur mit den Rohbytes laesst sich eine Verbesserung rueckwirkend auf die Historie anwenden - dieselbe Ueberlegung wie bei der Trennung von raw_items und codings. Kompression rund 22 %, etwa 20 kB je Abruf. Items ohne Titel werden weiter uebersprungen, jetzt aber gezaehlt. Bestandszeilen bekommen die neuen Felder beim naechsten Lauf nachgetragen, ohne als Revision zu zaehlen; der Inhalts-Hash bleibt dafuer auf Titel/Teaser/URL beschraenkt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011ZAdZb3EifGb9nvQ5Zp2TE
This commit is contained in:
@@ -21,8 +21,9 @@ Kodierung — was hier landet, soll sich beliebig oft neu kodieren lassen.
|
||||
# 1. Schema einspielen (Neuinstallation)
|
||||
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f schema.sql
|
||||
|
||||
# Bestehende Installation stattdessen migrieren:
|
||||
# Bestehende Installation stattdessen migrieren, aufsteigend:
|
||||
# psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f migrations/001-revisionen.sql
|
||||
# psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f migrations/002-rohablage-und-felder.sql
|
||||
|
||||
# 2. Image bauen
|
||||
podman build -t localhost/wurzelwerk-ingest:latest .
|
||||
@@ -57,7 +58,7 @@ python3 poller.py --sink jsonl:/pfad/zu/deinem/ablageordner
|
||||
```
|
||||
|
||||
Legt `<dir>/YYYYMMDD/YYYYMMDDHHMMSS.jsonl.gz` an, dedupliziert ueber eine
|
||||
SQLite daneben. Als `systemd --user`-Unit mit `Restart=always` einrichten.
|
||||
SQLite daneben, und die rohen Feeds unter `<dir>/YYYYMMDD/feeds/`. Als `systemd --user`-Unit mit `Restart=always` einrichten.
|
||||
|
||||
Der Sinn ist nicht Redundanz um ihrer selbst willen: RSS-Feeds haben kein
|
||||
Archiv. Steht der Produktiv-Poller einen Tag still, ist dieser Tag
|
||||
@@ -96,6 +97,26 @@ select quelle, count(*) filter (where revisionen > 0) as revidiert,
|
||||
from raw_items group by quelle order by quote desc;
|
||||
```
|
||||
|
||||
### Was die Verlage selbst labeln
|
||||
|
||||
```sql
|
||||
-- Themenverteilung je Quelle, ohne einen Kodierer bemueht zu haben
|
||||
select quelle, k as kategorie, count(*)
|
||||
from raw_items, unnest(kategorien) k
|
||||
group by quelle, k order by count(*) desc limit 20;
|
||||
```
|
||||
|
||||
### Speicherbedarf im Blick behalten
|
||||
|
||||
```sql
|
||||
select pg_size_pretty(pg_total_relation_size('feed_abrufe')) as rohablage,
|
||||
pg_size_pretty(pg_total_relation_size('raw_items')) as items;
|
||||
|
||||
-- Rohablage aelter als ein Jahr wegwerfen, falls es eng wird. raw_items
|
||||
-- bleibt davon unberuehrt; nur die Moeglichkeit, neu zu parsen, entfaellt.
|
||||
-- delete from feed_abrufe where abgerufen_am < now() - interval '1 year';
|
||||
```
|
||||
|
||||
### Waechter
|
||||
|
||||
```sql
|
||||
@@ -138,10 +159,37 @@ ueber die gesamte Historie, ohne dass ein Feed erneut abgerufen wird.
|
||||
Link, ersatzweise ein Titel-Hash.
|
||||
- **Fehlertoleranz**: eine kaputte Quelle beendet den Durchlauf nicht, der
|
||||
Fehler landet in `poll_laeufe`.
|
||||
- **Rohe Feed-Antworten** landen gezippt in `feed_abrufe`, dedupliziert ueber
|
||||
den sha256 der Rohbytes. Der Parser wird sich aendern; nur mit den Rohbytes
|
||||
laesst sich eine spaetere Verbesserung rueckwirkend auf die Historie
|
||||
anwenden. Kompression rund 22 %, etwa 20 kB je abgelegtem Abruf.
|
||||
- **Der Parser nimmt mit, was im XML steht**: Kategorien (`<category>`,
|
||||
`dc:subject`, Atom-`term`), `content:encoded` zusaetzlich zur kurzen
|
||||
`description`, Medien-URLs aus `enclosure` und Media RSS, Verweise aus dem
|
||||
Teaser-HTML, und die Position im Feed beim ersten Sehen. Die Kategorien sind
|
||||
fuer Stufe 2 der wertvollste Posten: vom Verlag selbst vergebene Themenlabel,
|
||||
brauchbar als Vorfilter und als Prompt-Kontext.
|
||||
- **Items ohne Titel** werden weiterhin uebersprungen, aber gezaehlt
|
||||
(`poll_laeufe.items_uebersprungen`) statt stillschweigend verworfen.
|
||||
- **Kein Volltext-Abruf.** Nur der Feed selbst wird geholt. Titel und Teaser
|
||||
reichen als Kodierungsinput, und damit stellt sich die TDM-Frage nach
|
||||
§ 44b UrhG gar nicht erst.
|
||||
|
||||
## Migration bestehender Installationen
|
||||
|
||||
`001` und `002` sind idempotent und koennen im laufenden Betrieb eingespielt
|
||||
werden; danach den Poller neu starten.
|
||||
|
||||
Nach `002` sind die neuen Spalten auf Bestandszeilen zunaechst leer. Der
|
||||
naechste Lauf traegt sie fuer alle Items nach, die die Quelle noch ausliefert
|
||||
(in der Ausgabe als `nachgetr`), ohne sie als Revision zu zaehlen. Items, die
|
||||
inzwischen aus dem Feed gefallen sind, behalten leere Zusatzfelder - die Daten
|
||||
sind nicht mehr abrufbar.
|
||||
|
||||
Der Inhalts-Hash bleibt bewusst auf Titel, Teaser und URL beschraenkt. Naehme
|
||||
er die neuen Felder auf, gaelte beim ersten Lauf nach dem Update jedes
|
||||
Bestandsitem als revidiert.
|
||||
|
||||
## Gemessen (2026-09-04)
|
||||
|
||||
Erster Lauf ueber 12 aktive Quellen: 820 Items gesehen, 810 neu, gesamter
|
||||
|
||||
Reference in New Issue
Block a user