Offer search query
On Offer, Search is GET /offer/{store}/search. One request starts on ShowSearch.vue, finds document ids in Typesense, loads the models, and shows SearchHitData cards.
When Typesense runs
You type a query or change a filter. The page calls router.get on FrontRoute.SearchStore.
ShowSearch asks ShowSearchRequest for StorefrontSearchData. That object holds the terms after stop-word removal, the selected types, the sort, and the filters. SearchStorefront turns the filters into a Typesense filter_by string through SearchDocumentsFilter.
QuerySearchDocuments searches the search collection. It queries title, keywords, description, and body. When the terms are at least three characters, it also sends a vector query from Embeddings. Typesense returns document ids only.
HydrateSearchDocuments loads those ids as Product, Provider, ContentTranslation, and ChallengeTranslation rows, in the same order. ShowSearch eager-loads the card relations, maps each row to SearchHitData, and Inertia renders the page.
When Typesense does not run
SearchStorefront returns an empty paginator when no result types are selected, or when Recommended for you has no recommended ids. That path does not call Typesense.
Out of scope
The chart is one storefront query. It does not show how documents are indexed, or backoffice search. Similar products on a product page are in Similar products.