diff --git a/adapters/research/search_connector.go b/adapters/research/search_connector.go index 087b437..d27a73f 100644 --- a/adapters/research/search_connector.go +++ b/adapters/research/search_connector.go @@ -81,7 +81,8 @@ func (c SearchConnector) collectEndpoint(ctx context.Context, configured SearchE if !strings.Contains(configured.Template, "%s") { return nil, ErrSearchRejected } - endpoint, err := url.Parse(strings.Replace(configured.Template, "%s", url.QueryEscape(strings.TrimSpace(request.Query)), 1)) + searchQuery := enrichedSearchQuery(request.Query) + endpoint, err := url.Parse(strings.Replace(configured.Template, "%s", url.QueryEscape(searchQuery), 1)) if err != nil || endpoint.Scheme != "https" || endpoint.Host == "" || !allowedHost(configured.AllowedHosts, strings.ToLower(endpoint.Hostname())) { return nil, ErrSearchRejected } @@ -204,6 +205,15 @@ func hasNumericSearchTerm(values []string) bool { return false } +func enrichedSearchQuery(query string) string { + trimmed := strings.TrimSpace(query) + lower := strings.ToLower(trimmed) + if (strings.Contains(lower, "цен") || strings.Contains(lower, "стоим")) && !strings.Contains(lower, "куп") { + return trimmed + " цена купить сегодня" + } + return trimmed +} + func allowedHost(hosts map[string]struct{}, host string) bool { _, ok := hosts[host]; return ok } func (c SearchConnector) limit() int { if c.MaxResults <= 0 || c.MaxResults > 8 { diff --git a/adapters/research/search_connector_test.go b/adapters/research/search_connector_test.go index 3e5a9fd..3011b89 100644 --- a/adapters/research/search_connector_test.go +++ b/adapters/research/search_connector_test.go @@ -46,3 +46,12 @@ func TestSearchConnectorFallsBackToAnotherAllowedSource(t *testing.T) { t.Fatalf("search result source = %#v", results[0].Source) } } + +func TestEnrichedSearchQueryAddsPriceSignalsOnlyToPriceRequests(t *testing.T) { + if got := enrichedSearchQuery("проверь цену на видеокарту 4090"); got != "проверь цену на видеокарту 4090 цена купить сегодня" { + t.Fatalf("price query = %q", got) + } + if got := enrichedSearchQuery("какая погода в Казани"); got != "какая погода в Казани" { + t.Fatalf("non-price query = %q", got) + } +}