Inconsistência na busca de produtos

Olá,

Estamos com um problema de inconsistência na busca de produtos da loja.

Por exemplo ao pesquisar por “DE LA SOUL” que é um dos produtos ele não é retornado

Se eu pesquiso somente SOUL os produtos aparecem

Precisamos de uma solução/orientação quanto a este problema o quanto antes,
Aguardo retorno

O motor de busca das lojas na e-com.plus utiliza Elasticsearch, que possui um recurso chamado stopwords onde palavras comuns
são ignoradas na indexação (“de”, “la”, “a”, “o”, etc.). O problema é que ao buscar “DE LA SOUL”, o Elasticsearch tenta encontrar produtos com “de” E “la” E “soul” simultaneamente. Como “de” e “la” são stopwords e nunca foram indexados, nenhum produto satisfaz essa condição. Já ao buscar “SOUL”, há apenas um termo indexado normalmente e os produtos aparecem.

A solução

A correção é feita no repositório da loja, no arquivo template/js/custom-js/html/SearchEngine.js. São duas alterações:

1. Atualizar o import na linha 34:

// Antes
import EcomSearch from '@ecomplus/search-engine'

// Depois
import EcomSearch, { dslMiddlewares } from '@ecomplus/search-engine'

2. Adicionar logo abaixo desse import:

dslMiddlewares.push(dsl => {
  const must = dsl.query && dsl.query.bool && dsl.query.bool.must
  if (Array.isArray(must)) {
    must.forEach(clause => {
      if (clause.multi_match) {
        clause.multi_match.operator = 'or'
      }
    })
  }
})

Isso instrui o Elasticsearch a usar o operador OR, ou seja, “DE LA SOUL” passará a retornar produtos que contenham qualquer um dos termos e como “soul” está indexado corretamente, os produtos aparecerão normalmente.

Possíveis efeitos colaterais

A mudança aumenta o recall (encontra mais resultados), mas pode reduzir levemente a precisão em alguns casos:

  • Busca "jazz rock" → com OR, retorna todos os jazz + todos os rock separadamente, em vez de apenas produtos classificados nos dois gêneros
  • Busca "pink floyd the wall" → pode trazer outros álbuns que contenham “wall” no título
  • Busca "vinil azul" → pode retornar produtos onde “azul” aparece em algum campo, mesmo sem relação direta

Na prática, o impacto é baixo: o Elasticsearch ordena os resultados por relevância, então produtos que combinam mais termos da busca aparecem primeiro. Para uma loja de discos onde as buscas são frequentemente por nomes de artistas e títulos de álbuns com stopwords (“De La Soul”, “Os Paralamas do Sucesso”, “O Rappa”, “A Cor do Som”, etc.) os benefícios superam os riscos, e manter zero resultados para esses casos é claramente pior.

Podem implementar caso tenham acesso ao repositório da loja, caso não tenham basta confirmar que desejam essa implementação que adicionamos por aqui.

Abraços.