Búsqueda por texto
Es el flujo principal del widget: el usuario escribe en lenguaje natural, el backend ejecuta búsqueda semántica + ranking conversacional, y el widget renderiza los resultados con filtros guiados, respuesta IA y top products.
Cómo funciona
- El usuario escribe en el componente
SearchInput. El input es un<textarea>(no<input>) para permitir queries largas y multi-línea. - Al pulsar Enter o el botón de submit, el widget llama a:
GET /api/widget/search?q=…cuando no hay carrito conectado.POST /api/widget/searchcon body JSON cuandocart.enabled = true(incluyecartContext).
- La respuesta
SearchResponsese aplica alWidgetContexty se renderiza la grilla de resultados, filtros guiados, top products y respuesta IA.
Definidos en
WidgetSearchController.java:73(GET) yWidgetSearchController.java:114(POST).
Endpoint
/api/widget/search# El parámetro se llama "q" (no "query"). limit por defecto = 10, máximo 50.
curl "https://api.neuroon.ai/api/widget/search?q=zapatillas%20running&limit=10" \
-H "X-Widget-Token: $WIDGET_TOKEN"
/api/widget/searchcurl -X POST https://api.neuroon.ai/api/widget/search \
-H "X-Widget-Token: $WIDGET_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"query": "zapatillas running",
"limit": 10,
"filters": { "categories": ["deportes"], "priceMin": 50, "priceMax": 200 },
"cartContext": { /* … */ }
}'
El POST usa
queryycartContexten el body (SearchRequestDTO.java:25); el GET usa?q=(WidgetSearchController.java:74).limitpor defecto = 10, máximo = 50.
Respuesta
SearchResponse (SearchResponseDTO):
| Campo | Descripción |
|---|---|
guidedFilters | Tarjetas de preguntas dinámicas generadas por la IA. |
aiResponse | AIResponseBox con la respuesta conversacional. |
topProducts | Carrusel destacado al inicio de la página de resultados. |
clarification, buyersGuide, kit, followUp, comparison, recommendations | Componentes específicos por tipo de turno. |
cartAction, quickReplies | Acciones cart-aware y chips de respuesta rápida. |
Comportamiento del input
- Ghost text — sugerencia inline (Tab para aceptar). Se calcula a partir del último resultado del endpoint
/api/widget/suggest(nosuggestions). Ver features/suggestions. - Debounce — el dropdown de sugerencias debouncea ~300 ms.
- Mobile —
font-size: 16pxmínimo para evitar el auto-zoom de iOS.
Sin estado persistente
Cada init() arranca con un searchLogId nuevo. Si necesitas continuidad entre páginas (que el widget recuerde la conversación), el backend ya emite un conversationId en SearchResponse que el widget reusa en peticiones subsiguientes mientras la sesión esté viva.
Próximas lecturas
- Sugerencias — diferencia entre
suggestionsysuggest. - AI assistant — cómo se compone la respuesta conversacional.
- Reference → Modelos de datos —
SearchResponsecompleto.