A camada oficial `@kirchdev/duxt-meilisearch` consome todo o
[snapshot `duxt:search:records`](/reference/hooks). Preserva IDs derivados da URL,
texto normalizado, origem, versão e idioma, incluindo seções geradas. Meilisearch
é opcional; a busca integrada não precisa de serviço.

::package-managers{command="add @kirchdev/duxt-meilisearch"}
::

```ts [nuxt.config.ts]
export 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'
    }
  }
})
```

Ative ambas as opções de produção apenas no trabalho de publicação. A presença
de `syncKey` não habilita gravações. Desenvolvimento, Nuxt prepare e contextos
reconhecidos de PR ou prévia ignoram a sincronização. Outros sistemas CI devem
usar `deployment: 'preview'` nas prévias. Cloudflare Pages também exige que
`DUXT_PRODUCTION_BRANCH` corresponda a `CF_PAGES_BRANCH`.

Use um índice exclusivo `docs`. A chave privada de build precisa de
`indexes.create`, `indexes.get`, `indexes.delete`, `indexes.swap`,
`settings.update`, `documents.add` e `tasks.get` para `docs` e `docs__duxt_*`.
A camada cria um índice temporário único, aguarda tarefas de configuração e
importação, troca-o atomicamente com `docs`, aguarda o sucesso da troca e só então
remove o snapshot anterior. Builds seguintes removem páginas excluídas; um
snapshot vazio esvazia o índice. Falhas de importação preservam o índice anterior.
Uma troca incerta mantém o índice temporário para evitar excluir dados
possivelmente publicados; falhas de limpeza são informadas. Serialize as
publicações se a ordem importar. A primeira sincronização cria o destino vazio
quando o índice temporário está pronto.

A chave privada nunca entra na configuração do navegador. Omita `searchKey`
para manter a busca integrada durante a sincronização. Para conectar o diálogo
existente, crie outra chave com **apenas** a ação `search` e **apenas** o índice
configurado `docs`. A chave de busca padrão abrange todos os índices; não a use.
Nunca publique uma chave mestra ou administrativa. A camada rejeita reutilizar a
chave privada conhecida; uma string opaca não revela permissões, portanto cabe
ao operador provisionar a chave restrita. Busca apenas no navegador não precisa
de chave privada. Permita a origem do site na configuração CORS do serviço.

A busca mantém a versão selecionada ou padrão de cada artefato e a cadeia de
idiomas de fallback. Uma tradução substitui sua página original; páginas sem
tradução continuam acessíveis no idioma original. A camada lê um inventário de
caminhos em cache pelo Content e exclui páginas cobertas por fonte, versão e
idioma antes da classificação e do limite. O campo `page`, usado apenas para
filtrar, contém a URL sem âncora; seções ocultas não ocupam a janela de 1.000
resultados. Sincronize uma vez antes da busca no navegador se uma compilação
anterior criou o índice. Erros do serviço produzem resultados vazios e
um aviso no console. Requisições HTTP expiram após 30 segundos; tarefas têm cinco
minutos, configuráveis por `sync.taskTimeoutMs`, até uma hora.

O pacote tem versão e changelog próprios. duxt não recebe SDK, credenciais nem
configuração do provedor. Interfaces próprias usam
`@kirchdev/duxt-meilisearch/search`; scripts de build podem usar
`@kirchdev/duxt-meilisearch/sync` com as mesmas opções de produção.

Consulte a [troca atômica](https://specs.meilisearch.dev/specifications/text/0191-swap-indexes-api.html),
as [tarefas assíncronas](https://www.meilisearch.com/docs/reference/api/async-task-management/get-task)
e as [chaves restritas](https://www.meilisearch.com/docs/reference/api/keys/create-api-key) do Meilisearch.

Meilisearch 1.54.3 oculta a tarefa global `indexSwap` (`indexUid: null`) de
chaves restritas por índice, mesmo que incluam ambos os índices. Com uma chave de
escrita restrita, forneça um `taskKey` privado apenas com
`actions: ['tasks.get']` e `indexes: ['*']`. Ele serve somente para consultar
tarefas e nunca é publicado. Sem ele, `syncKey` precisa ler tarefas globais. Um
404 oculto não confirma a publicação e preserva o índice temporário. Esse
comportamento foi verificado com o motor real.