Da busca vetorial às poderosas REST APIs, o Elasticsearch oferece aos desenvolvedores o kit de ferramentas de busca mais abrangente. Mergulhe em notebooks de exemplo no GitHub para experimentar algo novo. Você também pode iniciar seu teste gratuito ou executar o Elasticsearch localmente hoje mesmo.
Neste artigo, demonstraremos como implementar uma busca híbrida que combina os resultados da busca de texto completo com a busca vetorial. Ao unificar essas duas abordagens, a busca híbrida melhora a abrangência dos resultados, aproveitando o melhor de ambas as estratégias de busca.
Além de integrar a busca híbrida, demonstraremos como adicionar recursos que tornarão sua solução de busca ainda mais robusta. Isso inclui segmentação por facetas e promoções de produtos personalizadas. Além disso, mostraremos como capturar interações do usuário e gerar insights valiosos usando a ferramenta de Análise Comportamental da Elastic.
Nesta implementação, você verá como construir tanto a interface que permite aos usuários visualizar e interagir com os resultados da pesquisa quanto a API responsável por retornar as informações. Para acessar os repositórios com o código-fonte, os links são fornecidos abaixo:
- https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/hybrid-search-for-an-e-commerce-product-catalogue/product-store-search
- https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/hybrid-search-for-an-e-commerce-product-catalogue/app-product-store
Dividimos este guia em várias etapas, desde a criação do índice até a implementação de recursos avançados, como facetas e personalização de resultados. Ao final, você terá uma solução de busca robusta, pronta para ser usada em um cenário de comércio eletrônico.
Configuração do ambiente para pesquisa híbrida de comércio eletrônico
Antes de iniciarmos a implementação, precisamos configurar o ambiente. Você pode optar por usar um serviço na Elastic Cloud ou uma solução em contêineres para gerenciar o Elasticsearch. Se você optar pela conteinerização, uma configuração via Docker Compose pode ser encontrada neste repositório: docker-compose.yml.
Criação de índice e ingestão de catálogo de produtos
O índice será criado com base em um catálogo de produtos cosméticos, que inclui campos como nome, descrição, foto, categoria e etiquetas. Os campos usados para pesquisa de texto completo, como "nome" e "descrição", serão mapeados como text, enquanto os campos usados para agregações, como "categoria" e "marca", serão mapeados como keyword para permitir a filtragem facetada.
O campo "descrição" será usado para a busca vetorial, pois fornece mais contexto sobre os produtos. Este campo será definido como dense_vector, , armazenando a representação vetorial da descrição.
O mapeamento do índice será o seguinte:
O script para criar o índice pode ser encontrado aqui.
Geração de incorporação
Para vetorizar as descrições dos produtos, utilizamos o modelo all-MiniLM-L6-v2. Neste caso, a aplicação é responsável por gerar os embeddings antes da indexação. Outra opção seria importar o modelo para o cluster Elasticsearch, mas para este ambiente local, optamos por realizar a vetorização diretamente dentro da aplicação.
Utilizamos o conjunto de dados de cosméticos disponível no Kaggle para preencher o índice e, para melhorar a eficiência da ingestão de dados, usamos o processamento em lote. Durante essa mesma etapa de ingestão, geraremos os embeddings para o campo "description" e os indexaremos no novo campo "description_embeddings".
Todo o processo de ingestão de dados pode ser acompanhado e executado diretamente através do Jupyter Notebook disponível no repositório. O notebook fornece um guia passo a passo sobre como os dados são lidos, processados e indexados no Elasticsearch, permitindo fácil replicação e experimentação.
Você pode acessar o notebook no seguinte link: Notebook de Ingestão.
Implementação de busca híbrida
Agora, vamos implementar a busca híbrida. Para a pesquisa baseada em palavras-chave, usamos a consulta multi_match , direcionada aos campos "nome", "categoria" e "descrição". Isso garante que os documentos que contenham o termo de pesquisa em qualquer um desses campos sejam recuperados.
Para a busca vetorial, utilizamos a consulta KNN. O termo de pesquisa precisa ser vetorizado antes da execução da consulta, e isso é feito usando o método que vetoriza o termo de entrada. Note que o mesmo modelo usado durante a ingestão também é usado para o termo de pesquisa.
A combinação das duas buscas é realizada utilizando o algoritmo Reciprocal Rank Fusion (RRF) , que mescla os resultados das duas consultas e aumenta a precisão da busca ao reduzir o ruído. O RRF permite que as buscas baseadas em palavras-chave e em vetores funcionem em conjunto, aprimorando a compreensão da consulta do usuário.
Comparação de resultados: pesquisa por palavra-chave vs. pesquisa híbrida
Agora, vamos comparar os resultados de uma pesquisa tradicional por palavras-chave com a pesquisa híbrida. Ao pesquisar por "base para pele seca" usando a busca por palavras-chave, obtemos os seguintes resultados:

- Base Revlon ColorStay para Pele Normal/SecaDescrição: A Base Revlon ColorStay oferece cobertura de longa duração com uma fórmula leve que não craquela, desbota ou transfere. Com a tecnologia de liberação gradual, esta fórmula sem óleo e com equilíbrio de hidratação foi especialmente desenvolvida para peles normais ou secas, proporcionando hidratação contínua. Características: Maquiagem confortável e com duração de até 24 horas. Cobertura média a total. Disponível em uma variedade de lindas cores.
- Base Mousse Dream Smooth da Maybelline: Por que você vai amar? Esta base cremosa exclusiva proporciona uma pele 100% macia como a de um bebê. Pele com aparência e sensação de hidratação por 14 horas - nunca áspera ou ressecada. Fórmula leve que proporciona cobertura perfeitamente hidratante. Mistura-se perfeitamente e proporciona uma sensação de frescor o dia todo. Sem óleo, sem fragrância, testado por dermatologistas, testado contra alergias, não comedogênico – não obstrui os poros. Seguro. Para peles sensíveis.
Análise: Ao pesquisar por "base para pele seca", os resultados foram obtidos pela correspondência exata entre as palavras-chave do termo de pesquisa e os títulos e descrições dos produtos. No entanto, essa combinação nem sempre representa a melhor escolha. Por exemplo, a base Revlon ColorStay para pele normal/seca é uma boa opção, pois é formulada especificamente para pele seca. Apesar de ser isento de óleo, sua fórmula foi desenvolvida para proporcionar hidratação contínua. Em contrapartida, também recebemos a base Maybelline Dream Smooth Mousse, que, embora seja livre de óleo e mencione hidratação, geralmente é mais recomendada para peles oleosas ou mistas, já que os produtos sem óleo tendem a se concentrar no controle da oleosidade em vez de fornecer a hidratação extra necessária para peles secas. Isso evidencia a limitação das buscas baseadas em palavras-chave, que podem retornar produtos que não atendem completamente às necessidades específicas de pessoas com pele seca.
Agora, ao realizar a mesma pesquisa usando a abordagem híbrida:

- Base Cremosa CoverGirl Outlast Stay Luminous Natural (820): Descrição: A Base CoverGirl Outlast Stay Luminous é perfeita para obter um acabamento luminoso e um brilho sutil. É livre de óleo, com uma fórmula não oleosa que proporciona à sua pele uma luminosidade natural que dura o dia todo! Esta base de longa duração hidrata a pele enquanto proporciona uma cobertura impecável.
Análise: Este produto é uma excelente opção, pois prioriza a hidratação, que é fundamental para usuários com pele seca. Os termos "hidrata a pele" e "acabamento luminoso" estão alinhados com a intenção do usuário de encontrar uma base para pele seca. A busca vetorial provavelmente compreendeu o conceito de hidratação e o relacionou à necessidade de uma base que trate a pele seca. - Base Revlon ColorStay para Pele Normal/Seca: Descrição: A base Revlon ColorStay oferece cobertura de longa duração com uma fórmula leve que não craquela, desbota ou transfere. Com a tecnologia de liberação gradual, esta fórmula sem óleo e com equilíbrio de hidratação foi especialmente desenvolvida para peles normais ou secas, proporcionando hidratação contínua.
Análise: Este produto aborda diretamente as necessidades de usuários com pele seca, mencionando explicitamente que sua fórmula é indicada para pele normal ou seca. A "fórmula de equilíbrio de umidade" e a hidratação contínua são ideais para quem busca uma base que atenda às necessidades da pele seca. A busca vetorial recuperou com sucesso esse resultado, não apenas pela correspondência de palavras-chave, mas também pelo foco na hidratação e pela menção específica de pele seca como público-alvo. - Descrição da Base Sérum: As bases sérum são fórmulas leves com cobertura média, disponíveis em uma ampla gama de 21 tons. Essas bases oferecem cobertura moderada com aparência natural e uma sensação de sérum muito leve. Possuem viscosidade muito baixa e são dispensados com a bomba fornecida ou com o conta-gotas de vidro opcional, disponível para compra separadamente, caso seja de preferência.
Análise: Neste caso, a descrição enfatiza uma base sérum leve com toque natural, o que está de acordo com as necessidades de pessoas com pele seca, que geralmente buscam produtos suaves, hidratantes e que proporcionem um acabamento sem efeito craquelado. A busca vetorial provavelmente captou o contexto mais amplo de cobertura leve e natural e a textura semelhante a um sérum, que está associada à retenção de umidade e a uma aplicação confortável, tornando-a relevante para pele seca, mesmo que o termo "pele seca" não seja mencionado explicitamente.
Implementação de facetas
Os filtros são essenciais para refinar e filtrar os resultados da pesquisa de forma eficiente, proporcionando aos usuários uma navegação mais direcionada, especialmente em cenários com grande variedade de produtos, como no comércio eletrônico. Elas permitem que os usuários ajustem os resultados com base em atributos como categoria, marca ou preço, tornando a busca mais precisa. Para implementar este recurso, usamos agregações de termos nos campos category e brand , que foram definidos como keyword durante o estágio de criação do índice.
O código completo da implementação pode ser encontrado aqui.
Veja abaixo os resultados da busca por "base para pele seca":

Personalizando resultados: consultas fixadas
Em alguns casos, pode ser benéfico promover determinados produtos nos resultados da pesquisa. Para isso, utilizamos Consultas Fixadas, que permitem que produtos específicos apareçam no topo dos resultados. A seguir, realizaremos uma busca pelo termo "Fundação" sem promover nenhum produto:

Em nosso exemplo, podemos promover produtos que tenham a etiqueta "Sem Glúten". Ao utilizarmos os IDs dos produtos, garantimos que eles sejam priorizados nos resultados da pesquisa. Especificamente, promoveremos os seguintes produtos: Base Sérum (ID: 1043), Base de Alta Cobertura (ID: 1042) e Pó Translúcido Realista (ID: 1039).
Utilizamos IDs de produto específicos para garantir que eles sejam priorizados nos resultados da consulta. A estrutura da consulta inclui uma lista de IDs de produtos que devem ser "fixados" no topo (neste caso, os IDs 1043, 1042 e 1039), enquanto os resultados restantes seguem o fluxo orgânico da pesquisa, usando uma combinação de condições como a consulta de texto nos campos "nome", "categoria" e "descrição". Dessa forma, é possível promover itens de maneira controlada, garantindo sua visibilidade, enquanto o restante da busca permanece baseado na relevância usual.
Abaixo, você pode ver o resultado da execução da consulta com os produtos promovidos:

O código completo da consulta pode ser encontrado aqui.
Analisando o comportamento de busca com análise comportamental.
Até o momento, já adicionamos funcionalidades para melhorar a relevância dos resultados de busca e facilitar a descoberta de produtos. Agora, vamos finalizar nossa solução de busca incluindo um recurso que nos ajudará a analisar o comportamento de busca do usuário, identificando padrões como consultas com ou sem resultados e cliques nos resultados da busca. Para isso, usaremos o recurso de Análise Comportamental fornecido pela Elastic. Com ele, em apenas alguns passos, podemos monitorar e analisar o comportamento de busca do usuário, obtendo informações valiosas para otimizar a experiência de busca.
Criando a coleta de dados de análise comportamental
Nossa primeira ação será criar uma coleção, que será responsável por receber todos os eventos de análise comportamental. Para criar a coleção, acesse a interface do Kibana em Pesquisa > Análise Comportamental. No exemplo abaixo, criamos a coleção chamada tracking-search.

Integrar a análise comportamental à interface.
Nosso aplicativo front-end foi desenvolvido em JavaScript e, para integrar o Behavioral Analytics, seguiremos os passos descritos na documentação oficial da Elastic para instalar o Behavioral Analytics JavaScript Tracker.
Implementando o rastreador JavaScript
Agora, vamos importar o cliente rastreador para nosso aplicativo e usar os métodos trackPageView, trackSearch e trackSearchClick para capturar as interações do usuário.
Aviso: Embora utilizemos uma ferramenta para coletar dados de interação do usuário, é essencial garantir a conformidade com o GDPR. Isso significa informar claramente os usuários sobre quais dados estão sendo coletados, como serão usados e fornecer a opção de desativar o rastreamento. Além disso, devemos implementar medidas de segurança robustas para proteger as informações coletadas e respeitar os direitos do usuário, como o acesso e a exclusão de dados, garantindo que todas as etapas estejam em conformidade com os princípios do GDPR.
Etapa 1: Criando a instância do rastreador
Primeiro, criaremos a instância do rastreador que monitorará as interações. Nessa configuração, definimos o endpoint de destino, o nome da coleção e a chave da API:
Etapa 2: Capturando visualizações de página
Para rastrear visualizações de página, podemos configurar o evento trackPageView :
Para obter mais detalhes sobre o evento trackPageView , você pode consultar esta documentação.
Etapa 3: Capturar consultas de pesquisa
Para monitorar as ações de busca dos usuários, utilizaremos o método trackSearch :
Aqui estamos coletando o termo de pesquisa e os resultados da pesquisa.
Etapa 4: Rastreamento de cliques nos resultados da pesquisa
Finalmente, para capturar cliques nos resultados da pesquisa, usaremos o método trackSearchClick :
Coletamos informações sobre o ID do documento clicado, bem como o termo de pesquisa e os resultados da pesquisa.
Analisando os dados no Kibana
Agora que os eventos de interação do usuário estão sendo capturados, podemos obter dados valiosos sobre as ações de busca. O Kibana utiliza a ferramenta de Análise Comportamental para visualizar e analisar esses dados comportamentais. Para visualizar os resultados, basta navegar até Pesquisa > Análise Comportamental > Minha Coleção, onde será exibida uma visão geral dos eventos capturados.

Nesta visão geral, obtemos uma perspectiva ampla dos eventos registrados para cada ação integrada à nossa interface. A partir dessas informações, podemos obter insights valiosos sobre o comportamento de busca do usuário. No entanto, se você deseja criar painéis personalizados com métricas mais relevantes para o seu cenário específico, o Kibana oferece ferramentas poderosas para a criação de painéis, permitindo que você crie diversas visualizações de suas métricas.
Abaixo, criei algumas visualizações e gráficos para monitorar, por exemplo, os termos mais pesquisados ao longo do tempo, as consultas que não retornaram resultados, uma nuvem de palavras destacando os termos mais pesquisados e, finalmente, uma visualização geográfica para identificar a origem do acesso à pesquisa.

Conclusão
Neste artigo, implementamos uma solução de busca híbrida que combina busca por palavras-chave e busca vetorial, fornecendo resultados mais precisos e relevantes para os usuários. Exploramos também como usar recursos adicionais, como filtros e personalização de resultados com Consultas Fixadas, para criar uma experiência de busca mais completa e eficiente.
Além disso, integramos o Behavioral Analytics da Elastic para capturar e analisar o comportamento do usuário durante suas interações com o mecanismo de busca. Ao usar métodos como trackPageView, trackSearch e trackSearchClick, conseguimos monitorar consultas de pesquisa, cliques em resultados de pesquisa e visualizações de página, gerando informações valiosas sobre o comportamento de pesquisa.
Referências
Conjunto de dados
https://www.kaggle.com/datasets/shivd24coder/cosmetic-brand-products-dataset
Transformador
https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2
Fusão de Classificação Recíproca
https://www.elastic.co/guide/en/elasticsearch/reference/current/rrf.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/retriever.html#rrf-retriever
Consulta Knn
https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html
Consulta fixada
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-pinned-query.html
APIs de análise comportamental
https://www.elastic.co/guide/en/elasticsearch/reference/current/behavioral-analytics-apis.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/behavioral-analytics-overview.html




