diff --git a/backend/scraper/fetch_wiki_images.py b/backend/scraper/fetch_wiki_images.py index 8d7f9b1..5e77208 100644 --- a/backend/scraper/fetch_wiki_images.py +++ b/backend/scraper/fetch_wiki_images.py @@ -238,10 +238,11 @@ async def _commons_search(query: str, client: httpx.AsyncClient) -> str | None: resp2.raise_for_status() pages = resp2.json().get("query", {}).get("pages", {}) - # Trefferqualität: bevorzuge Bilder die den Suchbegriff im Dateinamen haben - # und lehne Treffer ab die keine Hundbezug haben - query_words = [w for w in query.lower().split() if len(w) > 3] - best_score = -1 + # Qualitätsprüfung: Dateiname muss ALLE signifikanten Wörter enthalten + # (verhindert Fehlmatches wie "Afghan" → Kind aus Afghanistan) + query_words = [w for w in query.lower().split() if len(w) > 3] + needed_score = len(query_words) # alle Wörter müssen vorkommen + best_score = -1 best: str | None = None for page in pages.values(): @@ -252,14 +253,16 @@ async def _commons_search(query: str, client: httpx.AsyncClient) -> str | None: if not thumb or not _is_usable(thumb): continue fname = urllib.parse.unquote(thumb).lower() - # Score: wie viele Suchbegriff-Wörter sind im Dateinamen? score = sum(1 for w in query_words if w in fname) if score > best_score: best_score = score best = thumb - # Mindestens 1 Wort des Suchbegriffs muss im Dateinamen vorkommen - return best if best_score >= 1 else None + # Alle signifikanten Wörter müssen im Dateinamen vorkommen + # Bei 1-Wort-Suchen: Mindestens 1 Match + if needed_score == 0: + return None + return best if best_score >= needed_score else None except Exception as exc: logger.debug("Commons search (%s): %s", query, exc)