Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/algolia/docsearch/llms.txt

Use this file to discover all available pages before exploring further.

DocSearch provides extensive customization options to tailor the search experience to your documentation site’s needs.

Placeholder Text

Customize the search input placeholder text to guide users:
import { DocSearch } from '@docsearch/react';

function App() {
  return (
    <DocSearch
      appId="YOUR_APP_ID"
      apiKey="YOUR_API_KEY"
      indexName="YOUR_INDEX_NAME"
      placeholder="Search documentation..."
    />
  );
}
The placeholder text automatically adapts when Ask AI features are enabled:
  • Default: Uses your custom placeholder prop or “Search docs”
  • Ask AI enabled: Changes to “Search docs or ask AI a question”
  • In Ask AI mode: Shows “Ask another question…”

Transform Items

The transformItems function allows you to modify search results before they’re displayed. This is useful for filtering, sorting, or enhancing results.
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  transformItems={(items) => {
    // Filter out deprecated pages
    return items.filter((item) => !item.url.includes('/deprecated/'));
  }}
/>

Common Use Cases

transformItems={(items) => {
  const currentVersion = 'v2';
  return items.filter((item) => 
    item.hierarchy?.lvl0?.includes(currentVersion)
  );
}}
transformItems={(items) => {
  return items.sort((a, b) => {
    // Prioritize "Getting Started" pages
    const aIsGettingStarted = a.hierarchy?.lvl1?.includes('Getting Started');
    const bIsGettingStarted = b.hierarchy?.lvl1?.includes('Getting Started');
    
    if (aIsGettingStarted && !bIsGettingStarted) return -1;
    if (!aIsGettingStarted && bIsGettingStarted) return 1;
    return 0;
  });
}}
transformItems={(items) => {
  return items.map((item) => ({
    ...item,
    // Add custom badge based on content type
    customBadge: item.type === 'lvl1' ? 'Guide' : 'Reference',
  }));
}}

Maximum Results Per Group

Control how many results are displayed per section:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  maxResultsPerGroup={10}
/>
The default value is determined by the Algolia search configuration. Setting this value will override the default behavior.

Custom Hit Component

Customize how individual search results are rendered:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  hitComponent={({ hit, children }) => (
    <div className="custom-hit">
      {children}
      {hit.type === 'lvl1' && (
        <span className="badge">Guide</span>
      )}
    </div>
  )}
/>

Using HTML Template Syntax

You can also use HTML template strings:
hitComponent={(props, { html }) => html`
  <div class="custom-hit">
    <h4>${props.hit.hierarchy.lvl1}</h4>
    <p>${props.hit.content}</p>
  </div>
`}
Add custom content at the bottom of search results:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  resultsFooterComponent={({ state }) => (
    <div className="custom-footer">
      <p>Found {state.collections.length} results</p>
      <a href="https://github.com/algolia/docsearch/issues">Can't find what you're looking for?</a>
    </div>
  )}
/>

Search Parameters

Pass additional Algolia search parameters to customize the search behavior:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indices={[
    {
      name: 'YOUR_INDEX_NAME',
      searchParameters: {
        hitsPerPage: 20,
        attributesToRetrieve: [
          'hierarchy.lvl0',
          'hierarchy.lvl1',
          'hierarchy.lvl2',
          'content',
          'url',
        ],
        attributesToSnippet: ['content:20'],
        distinct: 1,
        facetFilters: ['version:latest'],
      },
    },
  ]}
/>
The indices property replaces the deprecated indexName and searchParameters props, allowing you to search multiple indices with different configurations.

Multiple Indices

Search across multiple documentation indices:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indices={[
    'docs_v2',
    {
      name: 'docs_v1',
      searchParameters: {
        facetFilters: ['version:v1'],
      },
    },
    'blog',
  ]}
/>

Transform Search Client

Modify the Algolia search client before it’s used:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  transformSearchClient={(searchClient) => {
    // Add custom headers or modify requests
    return {
      ...searchClient,
      search(requests) {
        // Log search queries for analytics
        console.log('Search requests:', requests);
        return searchClient.search(requests);
      },
    };
  }}
/>

Initial Query

Pre-fill the search input with an initial query:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  initialQuery="getting started"
/>

Custom Navigator

Control navigation behavior when users select search results:
import { useNavigate } from 'react-router-dom';

function App() {
  const navigate = useNavigate();
  
  return (
    <DocSearch
      appId="YOUR_APP_ID"
      apiKey="YOUR_API_KEY"
      indexName="YOUR_INDEX_NAME"
      navigator={{
        navigate({ itemUrl }) {
          // Use React Router instead of default navigation
          navigate(itemUrl);
        },
      }}
    />
  );
}

Missing Results URL

Provide a feedback mechanism for queries with no results:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  getMissingResultsUrl={({ query }) => {
    return `https://github.com/your-org/docs/issues/new?title=Missing results for "${query}"`;
  }}
/>
When users search for something with no results, they’ll see a link to report the missing content.

Portal Container

Specify where the search modal should be rendered in the DOM:
<DocSearch
  appId="YOUR_APP_ID"
  apiKey="YOUR_API_KEY"
  indexName="YOUR_INDEX_NAME"
  portalContainer={document.getElementById('modal-root')}
/>
By default, the modal is rendered into document.body.

Build docs developers (and LLMs) love