Ricerca
On this page
Ricerca
BX Sites distribuisce un provider di ricerca di default e può essere
puntato su altri tramite searchProvider
di bxsites.json - search: true/false resta l'interruttore master
on/off indipendentemente da quale provider è attivo.
Locale (il predefinito)
La ricerca di BX Sites è completamente statica e lato client - lo stesso
approccio che usa mkdocs di default: un
indice costruito una sola volta al momento del build, e
lunr.js che effettua la ricerca vera e propria nel
browser del visitatore. Non è coinvolto alcun server, database o servizio
di ricerca esterno.
Come funziona
- Al momento del
build,SearchIndexerpercorre ogni pagina non nascosta e scrivesite/search-index.json: una voce per pagina con il suotitle,url, itagsdel frontmatter, il testo di ogni intestazione nella pagina, e una copia in testo semplice troncata del suo corpo (con i tag HTML rimossi). - Il parziale
search.bxmdi ogni tema renderizza un box di ricerca;layout.bxmlo include (insieme agli scriptlunr.js+search.jscondiviso) solo quandosearchdibxsites.jsonètrueesearchProvider.providerè"local"(il predefinito - vedi Altri provider sotto per cosa cambia con uno diverso). - Nel browser, il widget condiviso
assets/search.jsrecuperasearch-index.jsonuna sola volta, costruisce a partire da esso un indicelunr(contitlepesato di più, poi itagsdel frontmatter, poi gliheadings, poi il testo del corpo semplice), e ricerca di nuovo a ogni tasto premuto - nessuna richiesta di rete per ogni query.
Scorciatoie da tastiera
/porta il focus sul box di ricerca da qualsiasi punto della pagina (a meno che tu non stia già digitando in un altro campo) - la stessa convenzione usata da mkdocs-material.- Cmd/Ctrl+K porta anch'esso il focus, da qualsiasi punto - anche
mentre stai digitando in un altro campo - la convenzione che
condividono Algolia DocSearch, Pagefind, VitePress e Docusaurus. Il box
di ricerca mostra un piccolo suggerimento
Ctrl K/⌘K(rilevato in base alla piattaforma) così è scopribile. Escapechiude il menu a discesa dei risultati e toglie il focus dal box di ricerca.
Cmd/Ctrl+K funziona allo stesso modo per ogni provider - il widget
proprio di local lo collega direttamente, algolia lo ottiene
gratuitamente da DocSearch stesso (keyboardShortcuts predefinito a
true), e pagefind lo ottiene collegato da layout.bxm dato che
PagefindUI non lo collega da sé.
Disattivarla
{ "search": false }
Salta del tutto la compilazione di search-index.json, e salta il box di
ricerca, lo script incluso lunr.js, e il widget condiviso search.js in
ogni pagina renderizzata - un progetto con la ricerca disattivata non
distribuisce assolutamente nulla legato alla ricerca. Questo è
l'interruttore master - si applica indipendentemente da quale
searchProvider sia configurato.
Ricompilare solo l'indice
bxSites search-index
Utile se serve solo aggiornare search-index.json - build esegue giÃ
questo passaggio come uno dei propri, quindi non serve eseguirlo
separatamente dopo un build normale. Funziona solo per i provider che
usano l'indice locale ("local", e qualsiasi provider che bx-sites non
conosce altrimenti) - è un no-op (skipped: true) quando
searchProvider.provider è "algolia" o "pagefind", dato che nessuno
dei due lo usa mai.
Algolia
Imposta searchProvider.provider su "algolia" per sostituire il box di
ricerca con Algolia DocSearch - la
stessa ricerca ospitata dal crawler che supportano mkdocs-material,
VitePress, Starlight e Docusaurus:
{
"search": true,
"searchProvider": {
"provider": "algolia",
"algolia": {
"appId": "ABC123",
"apiKey": "a1b2c3d4e5f6...",
"indexName": "my-docs",
"insights": false
}
}
}
appId, apiKey e indexName sono obbligatori - apiKey è la chiave
API pubblica solo per la ricerca che ti fornisce DocSearch (mai una
chiave da amministratore; viene distribuita direttamente in ogni pagina
renderizzata). insights (false di default) attiva l'analytics di
click/conversione proprio di DocSearch.
Con algolia attivo:
- Nessun
search-index.jsonviene compilato, e il widget condivisolunr.js/search.jsnon viene distribuito - Algolia serve i risultati dal proprio indice ospitato, popolato dal crawler di DocSearch o dal tuo stesso Algolia Crawler, non da qualcosa che BX Sites scrive al momento del build. Devi comunque registrare il sito con DocSearch (o eseguire il tuo crawler) separatamente - BX Sites collega solo il widget client. - Ogni tema integrato renderizza invece un contenitore vuoto
#bxsites-search-algolia, elayout.bxmcarica@docsearch/css/@docsearch/jsda jsDelivr e chiamadocsearch({...})contro di esso - DocSearch renderizza il proprio pulsante di ricerca e la propria modale dentro quel contenitore.
Pagefind
Imposta searchProvider.provider su "pagefind" per sostituire il box
di ricerca con Pagefind - un altro motore di
ricerca completamente statico/senza server, ma indicizzato a partire
dall'HTML compilato di site/ invece che esplorato come Algolia:
{
"search": true,
"searchProvider": {
"provider": "pagefind",
"pagefind": { "bin": "pagefind", "options": [] }
}
}
Entrambe le chiavi pagefind sono opzionali - bin (predefinito
"pagefind") è il nome/percorso dell'eseguibile, risolto rispetto a
PATH quando è un nome nudo; options è un array di flag CLI grezzi
extra passati direttamente (ad es.
["--exclude-selectors", ".no-index"]).
Con pagefind attivo:
- La CLI
pagefinddeve essere già installata e suPATH- BX Sites ci esegue uno shell out (non c'è alcun binding nativo BoxLang, lo stesso motivo per cuilastUpdated/gh-deployeseguono uno shell out versogit), non la installa al posto tuo. Vedi la documentazione di installazione di Pagefind. A differenza dilastUpdated, un binario mancante/fallito fa fallirebuildin modo rumoroso (BxSites.PagefindFailed) invece di degradare in silenzio - distribuire un sito il cui provider di ricerca configurato non funziona è peggio di un build fallito. - Subito dopo che ogni albero di documenti (principale + versioni +
locale) è stato scritto e
sitemap.xml/llms.txtsono generati, BX Sites eseguepagefind --site <siteDir> [...opzioni]contro l'interosite/compilato - così un sito multi-versione/multi-locale ottiene tutto indicizzato in un solo passaggio, a differenza delsearch-index.jsonper-albero proprio di bx-sites. Pagefind scrive il proprio bundle direttamente insite/pagefind/- autoospitato, nessuna CDN coinvolta. - Nessun
search-index.jsonviene compilato, e il widget condivisolunr.js/search.jsnon viene distribuito (come peralgolia) - ebxSites search-indexè un no-op per lo stesso motivo (vedi sopra). - Ogni tema integrato renderizza un contenitore vuoto
#bxsites-search-pagefind, elayout.bxmcaricasite/pagefind/pagefind-ui.{css,js}e chiamanew PagefindUI({...})contro di esso - Pagefind renderizza il proprio box di ricerca inline e i propri risultati dentro quel contenitore.
Altri provider di ricerca
searchProvider.provider non è limitato a "local"/"algolia"/
"pagefind" - qualsiasi altro valore viene accettato da bxsites.json
così com'è (la validazione della configurazione propria di BX Sites
controlla solo i tre provider sopra). Non c'è alcun hook plugin per
questo caso - i temi integrati semplicemente non renderizzano nulla per
un nome di provider non riconosciuto, e collegare un quarto servizio di
ricerca (Meilisearch, Typesense, ecc.) è una
sovrascrittura di tema a livello di
progetto: copia un tema integrato nel theme/ proprio del tuo progetto e
aggiungi il markup/gli script del tuo provider al suo layout.bxm/
search.bxm, leggendo siteConfig.searchProvider per decidere quando
renderizzarli - rami searchProviderName eq "..." per il punto di
montaggio in search.bxm, rami corrispondenti in layout.bxm per il suo
CSS/JS, e (se non è ospitato da un crawler come Algolia) qualsiasi
passaggio di indicizzazione richieda quel prodotto contro site/ dopo
build - la stessa forma che già usano il layout.bxm/BuildPipeline.bx
propri di questo modulo per algolia/pagefind.