Merge pull request #25 from R0m1k3/claude/design-product-search-01Ea9dWZqZpuKFwBwVmp26PG

fix: Fix Browserless port and improve DuckDuckGo search
This commit is contained in:
LogiFlow authored and GitHub committed 2025-11-22 15:54:21 +01:00
commit 2f79bdf8ec
2 files changed
+34 -23

No files matched your search

+33 -22
View File
@@ -32,6 +32,7 @@ async def search(
) -> list[SearchResult]: ) -> list[SearchResult]:
""" """
Effectue une recherche DuckDuckGo ciblée sur les domaines spécifiés. Effectue une recherche DuckDuckGo ciblée sur les domaines spécifiés.
Recherche chaque domaine séparément pour de meilleurs résultats.
Args: Args:
query: Terme de recherche (ex: "lutin de noel") query: Terme de recherche (ex: "lutin de noel")
@@ -50,40 +51,41 @@ async def search(
clean_domains = [_clean_domain(d) for d in domains] clean_domains = [_clean_domain(d) for d in domains]
clean_domains = [d for d in clean_domains if d] clean_domains = [d for d in clean_domains if d]
# Construire la requête avec site: pour chaque domaine logger.info(f"Domaines ciblés: {clean_domains}")
site_query = " OR ".join([f"site:{domain}" for domain in clean_domains])
full_query = f"{query} ({site_query})"
all_results = []
seen_urls = set()
results_per_domain = max(5, max_results // len(clean_domains))
# Rechercher sur chaque domaine séparément
for domain in clean_domains:
# Format de requête simple: "query site:domain"
full_query = f"{query} site:{domain}"
logger.info(f"Recherche DuckDuckGo: {full_query}") logger.info(f"Recherche DuckDuckGo: {full_query}")
try: try:
# Exécuter la recherche dans un thread séparé (duckduckgo_search est synchrone)
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
results = await loop.run_in_executor( results = await loop.run_in_executor(
None, None,
lambda: _do_search(full_query, max_results * 2, timeout), lambda d=domain, q=full_query: _do_search(q, results_per_domain, timeout),
) )
# Filtrer pour ne garder que les domaines ciblés logger.info(f"DuckDuckGo [{domain}]: {len(results)} résultats bruts")
filtered_results = []
seen_urls = set()
for item in results: for item in results:
url = item.get("href", "") or item.get("link", "") url = item.get("href", "") or item.get("link", "")
if not url: if not url or url in seen_urls:
continue continue
# Éviter les doublons
if url in seen_urls:
continue
seen_urls.add(url) seen_urls.add(url)
# Vérifier que l'URL appartient à un des domaines ciblés
url_domain = _extract_domain(url) url_domain = _extract_domain(url)
if not any(domain in url_domain for domain in clean_domains):
# Vérifier que l'URL appartient au domaine ciblé
if domain not in url_domain and not url_domain.endswith(domain):
logger.debug(f"URL ignorée (domaine {url_domain} != {domain}): {url}")
continue continue
filtered_results.append( all_results.append(
SearchResult( SearchResult(
url=url, url=url,
title=item.get("title", ""), title=item.get("title", ""),
@@ -92,15 +94,18 @@ async def search(
) )
) )
if len(filtered_results) >= max_results: if len(all_results) >= max_results:
break break
logger.info(f"DuckDuckGo: {len(filtered_results)} résultats trouvés")
return filtered_results
except Exception as e: except Exception as e:
logger.error(f"Erreur DuckDuckGo: {e}") logger.error(f"Erreur recherche sur {domain}: {e}")
return [] continue
if len(all_results) >= max_results:
break
logger.info(f"DuckDuckGo: {len(all_results)} résultats totaux")
return all_results
def _do_search(query: str, max_results: int, timeout: float) -> list[dict]: def _do_search(query: str, max_results: int, timeout: float) -> list[dict]:
@@ -113,6 +118,12 @@ def _do_search(query: str, max_results: int, timeout: float) -> list[dict]:
safesearch="off", safesearch="off",
max_results=max_results, max_results=max_results,
)) ))
logger.info(f"DDGS.text('{query[:50]}...') retourne {len(results)} résultats")
# Log les premiers résultats pour debug
for i, r in enumerate(results[:3]):
logger.info(f" Résultat {i+1}: {r.get('href', 'N/A')[:80]}")
return results return results
except Exception as e: except Exception as e:
logger.error(f"Erreur lors de la recherche DuckDuckGo: {e}") logger.error(f"Erreur lors de la recherche DuckDuckGo: {e}")
+1 -1
View File
@@ -12,7 +12,7 @@ services:
- "8555:8555" - "8555:8555"
environment: environment:
- DATABASE_URL=postgresql://priceflow:priceflow@db:5432/priceflow - DATABASE_URL=postgresql://priceflow:priceflow@db:5432/priceflow
- BROWSERLESS_URL=ws://browserless:3012 - BROWSERLESS_URL=ws://browserless:3000
- LOG_LEVEL=INFO - LOG_LEVEL=INFO
- CORS_ORIGINS=* - CORS_ORIGINS=*
depends_on: depends_on: