Guides / Building Search UI / UI & UX patterns

Multi-index search with React InstantSearch

This is the React InstantSearch v7 documentation. React InstantSearch v7 is the latest version of React InstantSearch and the stable version of React InstantSearch Hooks.

If you were using React InstantSearch v6, you can upgrade to v7.

If you were using React InstantSearch Hooks, you can still use the React InstantSearch v7 documentation, but you should check the upgrade guide for necessary changes.

If you want to keep using React InstantSearch v6, you can find the archived documentation.

Multi-index search (federated search) is a method for searching multiple data sources simultaneously. This means that when users enter a search term, Algolia will look for and display results from all these data sources.

This doesn’t necessarily mean that the results from Algolia indices are combined since their contents could be quite different. Your approach may be to display the results from each index separately. You could display the top-rated items from a movie index alongside the list of results from a book index. Or you could display category matches alongside the list of results from a product index

Search multiple indices with InstantSearch

You can search several Algolia indices at once in your React InstantSearch app using multiple <Index> widgets. All indices must be on the same Algolia application.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import algoliasearch from 'algoliasearch/lite';
import {
  Hits,
  Index,
  InstantSearch,
  SearchBox,
} from 'react-instantsearch';

const searchClient = algoliasearch('YourApplicationID', 'YourSearchOnlyAPIKey');

function App() {
  return (
    <InstantSearch indexName="instant_search" searchClient={searchClient}>
      <SearchBox />

      <Index indexName="instant_search">
        <Hits />
      </Index>

      <Index indexName="instant_search_demo_query_suggestions">
        <Hits />
      </Index>
    </InstantSearch>
  );
}

Root-level and nested widgets

You can add any available widget in an <Index>. Nested widgets only affect this particular index, while direct children of the root <InstantSearch> widget impact everything.

In the following example, when typing in <SearchBox>, the query applies to both indices. Conversely, each <Index> contains a <Configure> widget that only affects its set of results. Both <Hits> display results for the index they’re targeting, using the same query, but with a different number of hits per page.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// ...

function App() {
  return (
    <InstantSearch indexName="instant_search" searchClient={searchClient}>
      <SearchBox />

      <Index indexName="instant_search">
        <Configure hitsPerPage={8} />
        <Hits />
      </Index>

      <Index indexName="instant_search_demo_query_suggestions">
        <Configure hitsPerPage={16} />
        <Hits />
      </Index>
    </InstantSearch>
  );
}

Searching the same index with different search parameters

Multi-index search doesn’t always mean searching in different indices. Sometimes, you may want to search in the same index, but with different search parameters. This can be useful, for example, when storing different types of content in a single Algolia index, or when you want to surface specific items based on an attribute.

In this situation, make sure to include an indexId on each <Index>.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ...

function App() {
  return (
    <InstantSearch indexName="instant_search" searchClient={searchClient}>
      <SearchBox />

      <Index indexName="instant_search" indexId="top_rated">
        <h2>Top-rated</h2>
        <Configure filters="rating = 5" />
        <Hits />
      </Index>

      <Index indexName="instant_search" indexId="all_products">
        <h2>All products</h2>
        <Hits />
      </Index>
    </InstantSearch>
  );
}

Search multiple indices with Autocomplete

You can use the Autocomplete library in your InstantSearch app to build a dynamic multi-source search experience. For example, you may want to display Query Suggestions together with recent searches, create a multi-column layout that mixes facets and item previews, or even dynamically change sources based on the query.

Autocomplete isn’t limited to Algolia indices: you can use static sources or fetch data from other APIs.

Category display

Algolia can help you display both category matches and results if you:

  • Add categories to your Query Suggestions either inline or listed below a result. For example, you might see the following in your Query Suggestions list “game of thrones in Books
  • Use multi-index search to display categories from a separate category index. This is useful if you want to display categories and Query Suggestions at the same time. Clicking such a result typically redirects to a category page. The following is a sample dataset for a product index and a category index.

Example product index

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[
  {
    "name": "Fashion Krisp",
    "description": "A pair of red shoes with a comfortable fit.",
    "image": "/fashion-krisp.jpg",
    "price": 18.98,
    "likes": 284,
    "category": "Fashion > Women > Shoes > Court shoes"
  },
  {
    "name": "Jiver",
    "description": "A blue shirt made of cotton.",
    "image": "/jiver.jpg",
    "price": 17.70,
    "likes": 338,
    "category": "Fashion > Men > Shirts > Dress shirt"
  }
]

Example category index

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
  {
    "name": "Court shoes",
    "category": "Fashion > Women > Shoes > Court shoes",
    "description": "A dress shoe with a low-cut front and a closed heel.",
    "url": "/women/shoes/court/"
  },
  {
    "name": "Dress shirt",
    "category": "Fashion > Men > Shirts > Dress shirt",
    "description": "A long-sleeved, button-up formal shirt that is typically worn with a suit or tie.",
    "url": "/men/shirts/dress/"
  }
]

Next steps

You now have a good starting point to create an even richer experience with React InstantSearch. Next up, you could improve this app by: