algoliasearch-helper is the low-level library that powers InstantSearch. It provides a programmatic API for managing search state, performing searches, and handling results. Most developers use InstantSearch.js, but the helper is useful for advanced customization or building custom search UIs.
Installation
npm install algoliasearch-helper algoliasearch
Basic Usage
import algoliasearch from 'algoliasearch';
import algoliasearchHelper from 'algoliasearch-helper';
const client = algoliasearch('YourApplicationID', 'YourSearchOnlyAPIKey');
const helper = algoliasearchHelper(client, 'products', {
facets: ['brand', 'category'],
disjunctiveFacets: ['color'],
hitsPerPage: 20,
});
helper.on('result', (event) => {
console.log('Results:', event.results);
});
helper.search();
AlgoliaSearchHelper
The main helper class for managing search.
Constructor
algoliasearchHelper(client, indexName, options)
Algolia search client instance.import algoliasearch from 'algoliasearch';
const client = algoliasearch('APP_ID', 'API_KEY');
Name of the Algolia index to search.
Initial search parameters.{
query: 'phone',
facets: ['brand'],
hitsPerPage: 20,
}
Properties
Current search state (immutable).console.log(helper.state.query);
console.log(helper.state.facets);
Results from the last search.if (helper.lastResults) {
console.log(helper.lastResults.hits);
}
Array of derived helpers (used internally by InstantSearch for multi-index).
Methods
search()
Trigger a search with current state.
setQuery(query)
Set the search query.
helper.setQuery('laptop').search();
setPage(page)
Set the current page (zero-based).
helper.setPage(2).search();
addFacet(facetName)
Add a facet to the search.
helper.addFacet('brand').search();
removeFacet(facetName)
Remove a facet from the search.
helper.removeFacet('brand').search();
addFacetRefinement(facet, value)
Add a facet filter.
helper.addFacetRefinement('brand', 'Apple').search();
removeFacetRefinement(facet, value)
Remove a facet filter.
helper.removeFacetRefinement('brand', 'Apple').search();
toggleFacetRefinement(facet, value)
Toggle a facet filter on/off.
helper.toggleFacetRefinement('brand', 'Apple').search();
clearRefinements()
Clear all refinements.
helper.clearRefinements().search();
setState(newState)
Set a new search state.
const newState = helper.state.setQuery('phone').setPage(0);
helper.setState(newState).search();
Events
The helper is an event emitter with these events:
result
Fired when search results are received.
helper.on('result', (event) => {
console.log('Results:', event.results);
console.log('State:', event.state);
});
error
Fired when a search error occurs.
helper.on('error', (event) => {
console.error('Search error:', event.error);
});
search
Fired when a search is triggered.
helper.on('search', (event) => {
console.log('Searching with state:', event.state);
});
change
Fired when the search state changes.
helper.on('change', (event) => {
console.log('State changed:', event.state);
console.log('Results:', event.results);
console.log('Page reset:', event.isPageReset);
});
SearchParameters
Immutable search parameters object.
Common Parameters
const params = helper.state
.setQuery('laptop')
.setPage(0)
.setHitsPerPage(20)
.addFacet('brand')
.addFacetRefinement('brand', 'Apple')
.addNumericRefinement('price', '>=', 100)
.addNumericRefinement('price', '<=', 1000);
helper.setState(params).search();
Methods
Set page number (zero-based).
Set number of hits per page.
addFacetRefinement(facet, value)
Add facet refinement.
addNumericRefinement(attribute, operator, value)
Add numeric refinement (operators: <, <=, =, !=, >=, >).
SearchResults
Search results wrapper with helper methods.
Properties
Array of search result hits.helper.lastResults.hits.forEach(hit => {
console.log(hit.objectID, hit.name);
});
Facet values and counts.helper.lastResults.facets.forEach(facet => {
console.log(facet.name, facet.data);
});
Examples
Basic Search
import algoliasearch from 'algoliasearch';
import algoliasearchHelper from 'algoliasearch-helper';
const client = algoliasearch('APP_ID', 'API_KEY');
const helper = algoliasearchHelper(client, 'products');
helper.on('result', ({ results }) => {
console.log(`Found ${results.nbHits} results`);
results.hits.forEach(hit => {
console.log(hit.name);
});
});
helper.setQuery('laptop').search();
Faceted Search
const helper = algoliasearchHelper(client, 'products', {
facets: ['brand', 'category'],
disjunctiveFacets: ['color'],
});
helper.on('result', ({ results }) => {
// Display facet counts
const brandFacet = results.getFacetByName('brand');
console.log('Brands:', brandFacet.data);
});
// Add refinements
helper
.addFacetRefinement('brand', 'Apple')
.addFacetRefinement('category', 'Laptops')
.search();
Numeric Filtering
const helper = algoliasearchHelper(client, 'products');
// Price range: $100 - $1000
helper
.addNumericRefinement('price', '>=', 100)
.addNumericRefinement('price', '<=', 1000)
.search();
const helper = algoliasearchHelper(client, 'products', {
hitsPerPage: 20,
});
helper.on('result', ({ results }) => {
console.log(`Page ${results.page + 1} of ${results.nbPages}`);
// Next page
document.querySelector('#next').onclick = () => {
helper.setPage(results.page + 1).search();
};
// Previous page
document.querySelector('#prev').onclick = () => {
helper.setPage(results.page - 1).search();
};
});
helper.search();
Multiple Indices
const productsHelper = algoliasearchHelper(client, 'products');
const articlesHelper = algoliasearchHelper(client, 'articles');
productsHelper.on('result', ({ results }) => {
console.log('Products:', results.hits);
});
articlesHelper.on('result', ({ results }) => {
console.log('Articles:', results.hits);
});
// Search both indices
const query = 'phone';
productsHelper.setQuery(query).search();
articlesHelper.setQuery(query).search();
Geo Search
const helper = algoliasearchHelper(client, 'stores');
// Search around a location (lat, lng, radius in meters)
const params = helper.state
.setQueryParameter('aroundLatLng', '40.71,-74.01')
.setQueryParameter('aroundRadius', 5000);
helper.setState(params).search();
Custom Event Handling
const helper = algoliasearchHelper(client, 'products');
helper.on('search', ({ state }) => {
console.log('Searching...', state.query);
showLoadingIndicator();
});
helper.on('result', ({ results }) => {
hideLoadingIndicator();
renderResults(results.hits);
});
helper.on('error', ({ error }) => {
hideLoadingIndicator();
showError(error.message);
});
helper.setQuery('laptop').search();
When to Use algoliasearch-helper
Use InstantSearch.js for most cases: InstantSearch.js provides a higher-level API with UI widgets. Use algoliasearch-helper only when you need direct control over search logic.
Use algoliasearch-helper when:
- Building a custom search UI without InstantSearch widgets
- Implementing complex search logic not supported by InstantSearch
- Integrating search into non-standard UI frameworks
- Building a search SDK for another framework
TypeScript Support
algoliasearch-helper includes TypeScript type definitions:
import algoliasearchHelper, {
AlgoliaSearchHelper,
SearchParameters,
SearchResults,
PlainSearchParameters,
} from 'algoliasearch-helper';
const helper: AlgoliaSearchHelper = algoliasearchHelper(
client,
'products',
{
facets: ['brand'],
}
);
helper.on('result', ({ results }: { results: SearchResults }) => {
console.log(results.hits);
});