Adicione sugestões de digitação rápidas e relevantes ao seu aplicativo, incorporando o contexto do usuário e fatores de classificação específicos do domínio.
Casos de uso: Gerenciamento de conteúdo, Catálogo
Setores: Varejo
Produtos: MongoDB Atlas, MongoDB Atlas Vector Search
Visão Geral da Solução
A funcionalidade conforme você digita — também conhecida como preenchimento automático, sugestão automática ou pesquisa preditiva — geralmente se refere à correspondência de caracteres de baixo nível, em vez de uma solução abrangente e criada especificamente. Essa funcionalidade ajuda você a navegar rapidamente para o conteúdo relevante desejado. Procurar o filme "Matriz" digitando "matr" na barra de pesquisa é um exemplo de funcionalidade conforme você digita.
A Vector Search e a pesquisa de texto completo são ótimas para combinar conteúdo semanticamente quando há uma query completa ou correspondências de palavras muito próximas. No entanto, uma funcionalidade integrada conforme você digita pode retornar resultados relevantes com ainda menos caracteres e mais distância entre a entrada de texto e a palavra-chave de destino. Essa solução lexical facilita a correspondência parcial e fornece resultados relevantes e sensíveis ao contexto.
Arquiteturas de referência
A solução de sugestão conforme você digita é arquiteturalmente direta. Conforme você digita, as solicitações são enviadas ao Atlas Search, que retorna resultados relevantes. A arquitetura é estruturada em torno de uma coleção especializada de entities
e as queries correspondentes.

Figura 1. Arquitetura de solução com pesquisa progressiva
Abordagem do modelo de dados
Cada sugestão apresentada ao usuário representa uma entidade exclusiva do seu domínio. As entidades devem ser modeladas como documentos individuais em uma coleção especializada e ajustada para a sugestibilidade conforme você digita.
A collection principal geralmente representa um tipo de entidade como documentos e outras entidades de domínio como campos de metadados ou documentos incorporados. Por exemplo, considere utilizar os dados de filmes de amostra disponíveis no Atlas. Conforme você digita, a pesquisa sugere nomes de filmes. No entanto, você também pode pesquisar nomes de membros do elenco. Por exemplo, você pode encontrar filmes estrelados por Kaanu Reevers digitando apenas "kea".
O modelo de dados tem o seguinte esquema:
_id
: ID exclusivo para esta collection no formato<type>-<natural id>
.type
: tipo de entidade/ objeto , por exemplo filme, marca, produto pessoal e categoria.name
: o nome ou título da entidade, que geralmente seria exclusivo por tipo.
É importante que os documentos da entidade tenham identificadores estáveis e exclusivos, pois as entidades são atualizadas regularmente a partir da collection principal. Atribuir um type
a cada entidade permite filtragem (sugerir membros do elenco em uma pesquisa específica de atores), agrupamento (organizar as sugestões por tipo) ou aumentar por tipo (filmes de peso superiores aos nomes dos membros do elenco).
Modelar entidades diretamente como documentos individuais permite que cada uma carregue campos de metadados opcionais para auxiliar na classificação, na exibição, na filtragem ou no agrupamento.
O modelo de documento alimenta o campo name
por meio de uma configuração de índice sofisticada, que divide os valores de diversas maneiras adequadas para consultas de várias maneiras. O poder dessa solução vem da união de várias estratégias de indexação e query.
{ "_id":"title-The Matrix", "name":"The Matrix", "type":"title" }
Construir a solução
Primeiro, identifique as entidades sugiríveis em seus dados. No cenário de filmes, eles incluiriam títulos de filmes, nomes de membros do elenco e talvez gêneros e nomes de diretor também.
A base desse sistema de sugestão conforme você digita é a seguinte:
Crie uma coleção
entities
e preencha-a usando o esquema modelado acima. Sempre que necessário, atualize a coleçãoentities
.Crie um Atlas Search
entities_index
utilizando uma configuração de índice como descrito abaixo.Crie um conjunto robusto de cláusulas de query, juntamente com quaisquer fatores de impulso pertinentes, dentro de um pipeline de agregação que usa
$search
.
Importação de entidades
Embora haja várias maneiras de preencher a coleção entities
, uma maneira direta de preenchê-la é executar um pipeline de agregação na coleção principal para trazer os títulos exclusivos de todos os filmes:
[ { $group: { _id: "$title", }, }, { $project: { _id: {$concat: [ "title", "-", "$_id" ]}, type: "title", name: "$_id" } }, { $merge: { into: "entities" } } ]
O estágio $project
converte cada título de filme exclusivo no esquema entities
necessário. Como essa coleção digita cada documento, o type
é codificado como um prefixo do _id
gerado e anexado ao título real do filme, criando um identificador reproduzível para cada título exclusivo. A inclusão de type
nos identificadores de entidade permite que diferentes tipos de entities
com o mesmo nome sejam independentes uns dos outros (pode haver um filme chamado "Aventura", bem como o gênero "Aventura").
Finalmente, o estágio $merge
adiciona todos os novos títulos e deixa os existentes intocados.
O documento do tipo título resultante para "The Matrix" é simplesmente:
{ "_id":"title-The Matrix", "name":"The Matrix", "type":"title" }
Cada tipo de entidade potencialmente precisa de sua própria técnica para mesclar na coleção entities
, como no caso das entidades "genre" e "cast", que precisam ser desenroladas de suas arrays aninhadas usando $unwind
.
Essa importação de entidades específicas do elenco inclui “Keanu Reeves” como:
{ "_id":"cast-Keanu Reeves", "name":"Keanu Reeves", "type":"cast", "weight": 6.637 }
Entidades de Indexação
O campo name
é indexado de várias maneiras, o que facilitará a correspondência parcial e a classificação na query.

Figura 2. Várias estratégias de indexação
O recurso de vários analisadores usa a configuração de índice do Atlas Search para permitir que um único campo de documento seja indexado de diversas maneiras.
O campo type
é indexado tanto como um campo token
, para filtragem equals
ou in
, quanto como um campo stringFacet
para fornecer um meio de obter contagens nos resultados de cada tipo de entidade.
A definição de índice lida com quaisquer outros campos adicionados além de _id
, type
e name
, por meio de mapeamento dinâmico ou das definições estáticas que você fornece. Neste exemplo, weight
é personalizado e tratado dinamicamente como um tipo numérico.
Como procurar sugestões
O índice de pesquisa especializada resultante fornece a base para queries conforme você digita. O campo name
é indexado de várias maneiras e comparado a usuários que digitam vários operadores de query ajustáveis. A ideia é comparar os operadores de query com os mapeamentos analisados de forma diferente e ver o que corresponde. Quanto mais correspondências forem encontradas, maior será a classificação da sugestão. Cada uma das cláusulas de query pode ser aumentada e somada independentemente, dando uma pontuação de relevância para a entidade correspondente. Essas pontuações podem ser aumentadas ainda mais por outros fatores, como um campo de entidade weight
opcional.

Figura 3. Exemplo de consulta e cálculo de pontuação de relevância
Geralmente, um usuário que seleciona uma sugestão executa uma pesquisa tradicional direcionada para o item selecionado. A pesquisa retorna todos os itens correspondentes.
Visite o repositório GitHub para esta solução.
Principais Aprendizados
Use uma configuração de índice especializada para modelar entidades sugestíveis como documentos: Siga as etapas acima para criar uma collection separada que contenha todas as entidades de qualquer fonte.
Crie um índice com estas configurações: Use essas configurações de índice quando sua collection principal modelar todas as entidades sugiríveis como documentos de nível superior.
Use a estrutura de índice para criar queries inteligentes: use seu índice para corresponder entidades e classificar sugestões conforme desejado.
Autores
Erik Hatcher, MongoDB