Hi,
Assuming you are using InstantSearch, the solution would be to use RefinementLists for the author, title, and keyword.
You can read more about them here: refinementList | InstantSearch.js | API parameters | API Reference | Algolia Documentation
const search = instantsearch({
appID: ..., // check the documentation here: https://www.algolia.com/doc/api-reference/widgets/instantsearch/js/
...
});
const authorList = instantsearch.widgets.refinementList({
container: '#author-refinement-list',
attribute: 'author', // assuming you have a field called author in your records
searchable: true // assuming the facet is defined as searchable in your configuration
});
const keywordList = instantsearch.widgets.refinementList({
container: '#keyword-refinement-list',
attribute: 'keyword', // assuming you have a field called keyword in your records
searchable: true, // assuming the facet is defined as searchable in your configuration
});
const titleList = instantsearch.widgets.refinementList({
container: '#title-refinement-list',
attribute: 'title', // assuming you have a field called title in your records
searchable: true, // assuming the facet is defined as searchable in your configuration
});
search.addWidgets([titleList, authorList, refinementList])
... // rest of your setup
search.start() // enable search
This should do what you are looking for, but it might be more natural for you users to have a main search bar that searches in all those fields at the same time as well (using the searchBox widget: searchBox | InstantSearch.js | API parameters | API Reference | Algolia Documentation). The users could then rely on the refinement lists as a fallback if they want to restrict their searches to a specific author / keyword, etc.
I hope that helps!