Meilisearch
Ajouter la couche complémentaire officielle pour une indexation atomique à la compilation et une recherche facultative dans le navigateur.
La couche officielle @kirchdev/duxt-meilisearch consomme l’intégralité de
l’instantané duxt:search:records. Elle conserve les IDs
issus des URL, le texte normalisé, la source, la version et la langue, y compris
les sections générées. Meilisearch reste facultatif ; la recherche intégrée
n’exige aucun service.
pnpm add @kirchdev/duxt-meilisearchexport default defineNuxtConfig({
extends: ['@kirchdev/duxt', '@kirchdev/duxt-meilisearch'],
duxtMeilisearch: {
host: process.env.MEILISEARCH_HOST,
index: 'docs',
searchKey: process.env.MEILISEARCH_SEARCH_KEY,
syncKey: process.env.MEILISEARCH_SYNC_KEY,
taskKey: process.env.MEILISEARCH_TASK_KEY,
sync: {
enabled: process.env.MEILISEARCH_SYNC_ENABLED === 'true',
deployment: process.env.DUXT_DEPLOYMENT === 'production'
? 'production' : 'preview'
}
}
})
Activez les deux options de production uniquement dans le travail de publication.
La présence de syncKey n’autorise aucune écriture. Le développement, Nuxt
prepare et les contextes reconnus de PR ou de prévisualisation ignorent la
synchronisation. Les autres systèmes CI doivent utiliser deployment: 'preview'
pour leurs prévisualisations. Cloudflare Pages exige aussi que
DUXT_PRODUCTION_BRANCH corresponde à CF_PAGES_BRANCH.
Utilisez un index dédié docs. La clé privée de compilation nécessite
indexes.create, indexes.get, indexes.delete, indexes.swap,
settings.update, documents.add et tasks.get pour docs et docs__duxt_*.
La couche crée un index temporaire unique, attend les tâches de configuration et
d’importation, l’échange atomiquement avec docs, attend la réussite de l’échange
puis supprime l’ancien instantané. Les compilations suivantes retirent les pages
supprimées ; un instantané vide vide l’index. Les erreurs d’importation préservent
l’ancien index. Un échange incertain conserve l’index temporaire pour éviter de
supprimer des données potentiellement publiées. Les erreurs de nettoyage sont
signalées. Sérialisez les publications si leur ordre compte. La première
synchronisation crée la cible vide une fois l’index temporaire prêt.
La clé privée n’entre jamais dans la configuration du navigateur. Sans
searchKey, la recherche intégrée reste active pendant la synchronisation. Pour
le dialogue existant, créez une clé distincte avec uniquement l’action
search et uniquement l’index configuré docs. La clé de recherche par défaut
couvre tous les index : ne l’utilisez pas. Ne publiez jamais de clé maître ou
administrative. La couche refuse la réutilisation de la clé privée connue ; une
chaîne opaque ne révèle pas ses permissions, donc leur restriction incombe à
l’opérateur. La recherche seule dans le navigateur ne nécessite aucune clé
privée. Autorisez l’origine du site dans la configuration CORS du service.
La recherche conserve la version sélectionnée ou par défaut de chaque artefact
et la chaîne de langues de repli. Une traduction remplace sa page originale ;
les pages sans traduction restent accessibles dans leur langue d’origine. La
couche lit un inventaire de chemins mis en cache via Content et exclut les pages
couvertes par source, version et langue avant le classement et la limite.
Le champ page, réservé au filtrage, contient l’URL sans ancre ; les sections
masquées n’occupent pas la fenêtre de 1 000 résultats. Synchronisez une fois avant
la recherche navigateur si une compilation précédente a créé l’index. Les
erreurs du service donnent une liste vide et un avertissement en console. Les
requêtes HTTP expirent après 30 secondes ; les tâches disposent de cinq minutes,
modifiables avec sync.taskTimeoutMs, jusqu’à une heure.
Le paquet possède sa version et son changelog. duxt ne reçoit ni SDK,
identifiants ni configuration du fournisseur. Les interfaces personnalisées
utilisent @kirchdev/duxt-meilisearch/search ; les scripts de compilation peuvent
utiliser @kirchdev/duxt-meilisearch/sync avec les mêmes options de production.
Consultez l’échange atomique, les tâches asynchrones et les clés restreintes de Meilisearch.
Meilisearch 1.54.3 masque la tâche globale indexSwap (indexUid: null) aux
clés limitées par index, même si elles couvrent les deux index. Avec une clé
d’écriture restreinte, fournissez un taskKey privé ayant uniquement
actions: ['tasks.get'] et indexes: ['*']. Il sert seulement à consulter les
tâches et n’est jamais publié. Sans lui, syncKey doit pouvoir lire les tâches
globales. Un 404 masqué ne confirme pas la publication ; l’index temporaire est
conservé. Ce comportement a été vérifié avec le moteur réel.