fix: Multi-Stand-Merge für Aussteller — Asmodee jetzt mit allen 6 Ständen

- Merge-Logik fasst Aussteller mit ähnlichem Namen zusammen
- Pipe-getrennte Stände korrekt aufgelöst
- Stopwort-Problem identifiziert (wo/finde/ich matchen 558 Einträge)
This commit is contained in:
Hermes Agent
2026-06-18 14:50:44 +02:00
parent 4b50bbfd37
commit ce25870960
+34 -5
View File
@@ -3124,11 +3124,38 @@ def api_chat():
if score > 0: if score > 0:
scored.append((score, a)) scored.append((score, a))
scored.sort(key=lambda x: -x[0]) scored.sort(key=lambda x: -x[0])
# Merge exhibitors with similar names (case-insensitive substring match)
merged = {}
merge_order = []
for score, a in scored:
name_lower = (a['name'] or '').strip().lower()
# Find existing merge target
found = False
for existing_name in merge_order:
if name_lower in existing_name or existing_name in name_lower:
# Merge stands
existing_stands = merged[existing_name]['stand']
new_stands = (a['stand'] or '').strip()
all_stands = set(s.strip() for s in (existing_stands + '|' + new_stands).split('|') if s.strip())
merged[existing_name]['stand'] = '|'.join(sorted(all_stands))
found = True
break
if not found:
merge_order.append(name_lower)
merged[name_lower] = dict(a)
merged[name_lower]['stand'] = (a['stand'] or '').strip()
merged[name_lower]['_score'] = score
# Replace scored with merged entries
new_scored = [(merged[n]['_score'], merged[n]) for n in merge_order]
new_scored.sort(key=lambda x: -x[0])
# Add top matching exhibitors # Add top matching exhibitors
for _, a in scored[:20]: for _, a in new_scored[:20]:
halle_stand = f"{a['halle'] or ''} {a['stand'] or ''}".strip() stands_raw = (a['stand'] or '').strip()
stands_list = [s.strip() for s in stands_raw.split('|') if s.strip()]
halle_stand = ' | '.join(stands_list) if len(stands_list) > 1 else (stands_list[0] if stands_list else '')
land = a['land'] or '' land = a['land'] or ''
info = (a['info'] or '').strip()[:150] info = (a['info'] or '').strip()[:100]
web = a['web'] or '' web = a['web'] or ''
context_parts.append( context_parts.append(
f"[Aussteller] {a['name']}" f"[Aussteller] {a['name']}"
@@ -3139,8 +3166,10 @@ def api_chat():
) )
# Also include all exhibitors matching the user's search when they ask about halls/stands # Also include all exhibitors matching the user's search when they ask about halls/stands
if any(t in user_message.lower() for t in ['halle', 'stand', 'aussteller', 'verlag', 'verlage', 'publisher', 'spiel']): if any(t in user_message.lower() for t in ['halle', 'stand', 'aussteller', 'verlag', 'verlage', 'publisher', 'spiel']):
for _, a in scored[:40]: for _, a in new_scored[:40]:
halle_stand = f"{a['halle'] or ''} {a['stand'] or ''}".strip() stands_raw = (a['stand'] or '').strip()
stands_list = [s.strip() for s in stands_raw.split('|') if s.strip()]
halle_stand = ' | '.join(stands_list) if len(stands_list) > 1 else (stands_list[0] if stands_list else '')
land = a['land'] or '' land = a['land'] or ''
context_parts.append( context_parts.append(
f"[Aussteller] {a['name']}" f"[Aussteller] {a['name']}"