Ejemplos y extensiones
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Estos ejemplos son interactivos. Haz clic en un botón para abrir el modal y probar una consulta.
Búsqueda básica por palabras clave
Utiliza la experiencia predeterminada con tus credenciales de índice. Funciona perfectamente para documentación típica, blogs y cualquier sitio con un índice compatible con DocSearch.
<DocSearch
appId="PMZUYBQDAK"
apiKey="24b09689d5b4223813d9b8e48563c8f6"
indexName="docsearch"
insights={true}
translations={{ button: { buttonText: 'keyword search (demo)' } }}
/>
Ask AI: Respuestas asistidas por IA
Añade Algolia AskAI para obtener respuestas sintetizadas basadas en tu contenido indexado. Puedes delimitar el contexto del LLM usando searchParameters como facetFilters, filters, attributesToRetrieve,restrictSearchableAttributes y distinct.
<DocSearch
appId="PMZUYBQDAK"
apiKey="24b09689d5b4223813d9b8e48563c8f6"
indexName="docsearch"
askAi={{
assistantId: 'askAIDemo',
searchParameters: {
facetFilters: ['language:en'],
},
}}
insights={true}
translations={{ button: { buttonText: 'search with askai (demo)' } }}
/>
Renderizado personalizado de resultados (hitComponent)
Reemplaza el marcado predeterminado de resultados para que coincida con tu marca y diseño. A continuación se muestra un ejemplo mínimo de un componente personalizado.
function CustomHit({ hit }) {
// render a compact, branded hit card
return (
<a
href={hit.url}
style={{ display: 'block', padding: '12px 16px', textDecoration: 'none' }}
>
<div style={{ display: 'flex', gap: 12 }}>
<div
style={{
width: 40,
height: 40,
backgroundColor: '#e3f2fd',
borderRadius: 6,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
fontWeight: 600,
color: '#1976d2',
}}
>
{hit.type?.toUpperCase?.() || 'DOC'}
</div>
<div style={{ minWidth: 0 }}>
<div
style={{
fontWeight: 600,
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis',
}}
>
{hit.hierarchy?.lvl1 || 'untitled'}
</div>
{hit.hierarchy?.lvl2 && (
<div
style={{
color: '#666',
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis',
}}
>
{hit.hierarchy.lvl2}
</div>
)}
{hit.content && (
<div style={{ color: '#888', marginTop: 4 }}>{hit.content}</div>
)}
</div>
</div>
</a>
);
}
<DocSearch
appId="PMZUYBQDAK"
apiKey="24b09689d5b4223813d9b8e48563c8f6"
indexName="docsearch"
hitComponent={CustomHit}
insights={true}
translations={{ button: { buttonText: 'custom hits (demo)' } }}
/>;
Abrir enlaces en nuevas pestañas
Por defecto, DocSearch abre los enlaces de resultados en la misma ventana. Si necesitas que se abran en nuevas pestañas, debes usar tanto un hitComponent personalizado como la propiedad navigator para manejar consistentemente clics y navegación por teclado.
// Custom hit component with target="_blank"
function HitWithNewTab({ hit, children }) {
return (
<a href={hit.url} target="_blank" rel="noopener noreferrer">
{children}
</a>
);
}
// Navigator configuration to handle keyboard navigation
const newTabNavigator = {
navigate: ({ itemUrl }) => window.open(itemUrl, '_blank'),
navigateNewTab: ({ itemUrl }) => window.open(itemUrl, '_blank'),
navigateNewWindow: ({ itemUrl }) => window.open(itemUrl, '_blank'),
};
<DocSearch
appId="PMZUYBQDAK"
apiKey="24b09689d5b4223813d9b8e48563c8f6"
indexName="docsearch"
hitComponent={HitWithNewTab}
navigator={newTabNavigator}
insights={true}
translations={{ button: { buttonText: 'open in new tabs (demo)' } }}
/>;
Nota: Usar solo hitComponent con target="_blank" funciona para clics de ratón, pero la navegación por teclado (flechas + Enter) requiere la propiedad navigator para abrir enlaces en nuevas pestañas consistentemente.
Trae tu propia estructura de datos con transformItems
DocSearch no está limitado a registros tipo documentación. Usa transformItems para adaptar cualquier estructura de registro al formato interno que DocSearch espera. Esto te permite implementar búsqueda para aplicaciones, centros de ayuda, registros de cambios o cualquier contenido personalizado.
El siguiente fragmento mapea un registro no estándar al formato interno. Pruébalo en vivo:
<DocSearch
appId="PMZUYBQDAK"
apiKey="24b09689d5b4223813d9b8e48563c8f6"
indexName="crawler_doc"
askAi={{ assistantId: 'askAIDemo' }}
searchParameters={{
attributesToRetrieve: ['*'],
attributesToSnippet: ['*'],
hitsPerPage: 20,
}}
transformItems={(items) =>
items.map((item) => ({
objectID: item.objectID,
content: item.content ?? '',
url: item.domain + item.path,
hierarchy: {
lvl0: (item.breadcrumb || []).join(' > ') ?? '',
lvl1: item.h1 ?? '',
lvl2: item.h2 ?? '',
lvl3: null,
lvl4: null,
lvl5: null,
lvl6: null,
},
url_without_anchor: item.domain + item.path,
type: 'content',
anchor: null,
_highlightResult: item._highlightResult,
_snippetResult: item._snippetResult,
}))
}
insights={true}
translations={{ button: { buttonText: 'transform items (demo)' } }}
/>
Consejos
-
Instrumentación: activa
insightspara enviar análisis de uso e iterar sobre la relevancia. -
Delimitación de Ask AI: usa
facetFilters,filters,attributesToRetrieve,restrictSearchableAttributesydistinctpara controlar el contexto de IA y mejorar la calidad de las respuestas. -
Personalización: utiliza
hitComponent,transformItemsytranslationspara integrar DocSearch nativamente en cualquier superficie de producto.