Saltar al contenido principal

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

  1. El usuario escribe en el componente SearchInput. El input es un <textarea> (no <input>) para permitir queries largas y multi-línea.
  2. 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/search con body JSON cuando cart.enabled = true (incluye cartContext).
  3. La respuesta SearchResponse se aplica al WidgetContext y se renderiza la grilla de resultados, filtros guiados, top products y respuesta IA.

Definidos en WidgetSearchController.java:73 (GET) y WidgetSearchController.java:114 (POST).

Endpoint

GET/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"
POST/api/widget/search
curl -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 query y cartContext en el body (SearchRequestDTO.java:25); el GET usa ?q= (WidgetSearchController.java:74). limit por defecto = 10, máximo = 50.

Respuesta

SearchResponse (SearchResponseDTO):

CampoDescripción
guidedFiltersTarjetas de preguntas dinámicas generadas por la IA.
aiResponseAIResponseBox con la respuesta conversacional.
topProductsCarrusel destacado al inicio de la página de resultados.
clarification, buyersGuide, kit, followUp, comparison, recommendationsComponentes específicos por tipo de turno.
cartAction, quickRepliesAcciones 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 (no suggestions). Ver features/suggestions.
  • Debounce — el dropdown de sugerencias debouncea ~300 ms.
  • Mobilefont-size: 16px mí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