Since May 1st, 2024, Apple requires all iOS apps to include a privacy manifest.
For more details, see Privacy Manifest.
Who should use this guide
Advanced InstantSearch users may have the need to query Algolia’s servers from their backend instead of the frontend, while still being able to reuse InstantSearch widgets. Possible motivations could be for security restrictions, for SEO purposes, or to enrich the data sent by the custom server (i.e. fetch Algolia data and data from their own servers). If this sounds appealing to you, feel free to follow this guide. Keep in mind though that we, at Algolia, recommend doing frontend search for performance and high availability reasons. By the end of this guide, you will have learned how to leverage InstantSearch with your own backend architecture to query Algolia. Even if you’re not using Algolia on your backend and still want to benefit from using InstantSearch, then this guide is also for you.A quick overview on how InstantSearch works
InstantSearch, as you probably know, offers reactive UI widgets that automatically update when new search events occur. Internally, it uses aSearchable
interface that takes care of making network calls to get search results. The most important method of that Searchable
is a simple search()
function that takes in a parameter that contains all the search query parameters, and then expects a callback to be called with the search results that you get from your backend. Let’s see how this works in action
Basic implementation of using a custom backend
The most basic implementation of using a custom backend uses theDefaultSearchClient
and requires you to implement just one method: search(query:searchResultsHandler:)
. In this function, you use the query passed to you, make a network request to your backend server, transform the response into a SearchResults
instance, and then finally call the searchResultsHandler
callback with the searchResults. In case of error, you call the callback with the error. Here is an example using the Alamofire networking library.
Swift
SearchResults
instance. In case your response data is different than the original one returned by Algolia, especially in the case where you’re not using Algolia at all in your backend, then you can use one of our initializer of SearchResults such as SearchResults(nbHits:hits)
.
4- Call the searchResultsHandler
function in order to instruct InstantSearch about the new search event, in this case the arrival of new search results, or an error.
Integrate the custombackend
Now the last step is to use that custombackend with InstantSearch. In case you want to use it with InstantSearch Core only (theSearcher
class):
Swift
Swift
Swift
Advanced implementation of using a custom backend
The above snippet only covers the case of doing a basic search of hits, with conjunctive (contrary to disjunctive) filtering. Here, we’ll take a look at improving the structure of our custom backend class, as well as supporting disjunctive faceting. let’s start with the code snippetSwift
SearchClient
. Use your 2 models created in 1 for the generics of that class. This will ensure strong typing and good practices throughout this implementation.
3- Implement the basic param mapper function that converts a query to your parameter model. Make sure you take all the fields you need from the query parameter.
4- Implement the advanced param mapper function. It is the same as 3, but with 2 more parameters that you can use for your call: disjunctiveFacets
and refinements
.
5- Implement the result mapper function that converts your result model back to an Algolia SearchResults
that can be understood by InstantSearch.
6- In case you want to specify the possible facets for a refinement list, make sure you specify the facets property appropriately. In the code snippet, we just give an example, but usually you’ll want to get this data from your custom result model.
7- Implement the search method, same idea as the basic implementation. The only difference is that now it provides your custom parameter model as its parameter.
8- When you get new search results, you serialize them into your custom response model and then call the searchResultsHandler
method.
Integrate the custombackend
Now the last step is to use that custombackend with InstantSearch. In case you want to use it with InstantSearch Core only (theSearcher
class):
Swift
Swift
Swift
Trick to get more out of the query
One little trick you can use to get more detailed information about thequery
being passed as a parameter is to upcast it to a SearchParameters
by doing
Swift
disjunctiveFacets
, facetRefinements
, disjunctiveNumerics
and numericRefinements
. This can be useful when transforming Algolia’s Query.