Introdução
Uma consulta em todo o seu projeto - produtos, páginas, blocos, formulários, pedidos e mais, agrupados por tipo de entidade.
🎯 O que este módulo faz?
O módulo Search envolve o endpoint público de busca entre entidades. Você passa uma consulta de texto e recebe de volta todos os registros cujo nome ou valor de atributo corresponda, de 18 tipos de entidades de uma só vez, agrupados por tipo e anotados com como cada registro correspondeu.
Use-o para alimentar uma caixa de "buscar tudo" global - do tipo que mostra alguns produtos, algumas páginas e um formulário correspondente em um único dropdown - e depois aprofunde-se em um único tipo quando o usuário pedir mais.
Esta é uma busca por palavras-chave: ela corresponde ao texto literal de títulos, identificadores, URLs e valores de atributos. Para busca baseada em significado (uma consulta como "jaqueta quente para o inverno" correspondendo a um produto chamado "parka isolada"), use a busca semântica dos módulos individuais - veja Busca vetorial vs busca global abaixo.
🚀 Início Rápido
Inicialize o módulo a partir de defineOneEntry:
const { Search } = defineOneEntry( "your-project-url", { "token": "your-app-token" });
Busque tudo, depois percorra os grupos:
// Search every entity type for "winter".
const result = await Search.globalSearch('winter');
console.log(result.query); // "winter"
result.groups.forEach((group) => {
console.log(group.type, group.items.length, group.hasMore);
group.items.forEach((item) => {
console.log(item.id, item.title, item.matchKind, item.fragment);
});
});
✨ Conceitos Chave
Grupos
A resposta não é uma lista plana. É { query, groups }, onde cada grupo contém os registros de um tipo de entidade:
{
query: "winter",
groups: [
{ type: "products", items: [ /* … */ ], hasMore: false },
{ type: "pages", items: [ /* … */ ], hasMore: false }
]
}
hasMore informa se existem mais registros desse tipo além da página retornada - a dica para oferecer um link "mostrar todos os produtos" que re-executa a consulta em modo de aprofundamento.
Contexto da correspondência
Cada item carrega o contexto de como ele correspondeu, para que você possa renderizar uma linha de resultado significativa em vez de um título simples:
| Campo | O que ele te diz |
|---|---|
matchKind | Tipo de classificação da correspondência: exata, título, nomeAtributo ou valorAtributo |
matchedField | O campo concreto que correspondeu: id, título, identificador, url, nomeAtributo, valorAtributo, importId, nomeDoNó |
matchedAttribute | O atributo em que a correspondência ocorreu (quando a correspondência veio de um atributo) |
fragment | Contexto em texto simples ao redor da correspondência, sem marcação - destaque você mesmo |
langCode | Idioma do valor correspondente, para que você possa rotular correspondências entre idiomas |
parent | O registro proprietário para entidades que não têm uma página própria (um slide → seu bloco, um pedido → seu armazenamento) |
Tipos de entidade
types restringe a busca. Passe qualquer um deles, e o SDK os enviará separados por vírgula:
products, pages, blocks, slides, templates, discounts, user_groups, users, admins, menus, forms, attributes_sets, attributes, orders, workflows, events, subscriptions, collections.
Omitir types para buscar todos eles.
Modo de Aprofundamento
offset e limit mudam o endpoint para modo de aprofundamento - paginando através de um tipo de entidade em vez de visualizar todos eles.
⚠️ Eles são aceitos apenas juntos com exatamente um tipo acessível em
types. Qualquer outra combinação retorna 400 - O modo de aprofundamento (limite/deslocamento) requer exatamente um tipo acessível emtypes.
O SDK não os define como padrão: omita ambos e cada grupo retorna na íntegra.
// Overview: every type, every group complete.
const overview = await Search.globalSearch('winter');
// Drilldown: page 1 of the products only.
const products = await Search.globalSearch('winter', ['products'], 'visible', 0, 20);
Visibilidade
visibility filtra os registros pesquisados: 'all' (padrão), 'visible' ou 'hidden'.
📋 O que você precisa saber
idé um número para a maioria dos tipos, uma string para workflows e atributos -number | string, então não assuma ids numéricos ao construir chaves ou URLs.titleé opcional: registros sem nome próprio (pedidos, usuários sem login) retornam sem ele. Volte paraidentifierousubtitle.subtitlecarrega a linha secundária que o tipo possui - uma URL de página, um armazenamento de pedido, um nome de nó.attributeSetIdestá presente apenas paratype: "attributes", apontando para o conjunto ao qual o atributo pertence.- Apenas registros que o chamador atual pode ver são retornados; a busca respeita as mesmas regras de acesso que o resto da API.
📊 Tabela de Referência Rápida
| Método | Descrição |
|---|---|
| globalSearch() | Pesquisar nomes e valores de atributos em todos os tipos de entidade |
Busca vetorial vs busca global
Ambas encontram registros a partir de uma consulta de texto, mas respondem a perguntas diferentes:
| globalSearch | get…ByVectorSearch | |
|---|---|---|
| Corresponde a | O texto literal de títulos, identificadores, URLs e valores de atributos | Significado - uma similaridade semântica (vetorial) |
| Escopo | 18 tipos de entidades em uma chamada | Um módulo por chamada |
| Retorna | { query, groups[] } - agrupados por tipo | { items, total } - um contêiner plano |
| Uso típico | Uma caixa de busca global / paleta de comandos | "Encontre algo como isso" em uma entidade |
Os equivalentes semânticos vivem nos próprios módulos: products, pages, users, orders, discounts, admins e form data.
❓ Perguntas Comuns (FAQ)
Por que meu offset / limit retorna 400?
Porque eles só funcionam no modo de aprofundamento. Passe exatamente um tipo de entidade acessível em types junto com eles, ou omita-os completamente.
Como faço para destacar a correspondência na interface do usuário?
Use fragment - é o contexto em texto simples ao redor da correspondência, deliberadamente livre de marcação, para que você possa destacar a consulta nele mesmo sem sanitizar nada.
Um item não tem title. Isso é um bug?
Não. Pedidos e usuários sem login não têm nome próprio, então title simplesmente está ausente. Renderize identifier, subtitle ou um rótulo específico do tipo em vez disso.
Posso buscar registros ocultos?
Passe visibility: 'hidden' (ou 'all') - sujeito às regras de acesso que se aplicam ao chamador.
🎓 Melhores Práticas
- Debounce a consulta em uma caixa de busca enquanto digita: cada tecla pressionada é uma solicitação.
- Mostre a chamada de visão geral primeiro (sem
offset/limit), depois mude para aprofundamento quando o usuário escolher um tipo - é exatamente para isso que servehasMore. - Restringa
typesao que sua interface pode realmente renderizar; buscar 18 tipos para exibir 2 é trabalho desperdiçado. - Trate
idcomonumber | stringao construir links e chaves React.
🔗 Documentação Relacionada
- Módulo de Produtos - Busca semântica de produtos e o catálogo de produtos
- Módulo de Páginas - Páginas retornadas no grupo
pages - Módulo de Filtros - Árvores de filtro curadas para navegação facetada