Otimização de resultados de busca

Fala Matheus. Blz?
Preciso fazer uma melhoria aqui no sistema de busca do site. Há um tempo atrás fizemos uma mehoria de colocar os produtos em order decrescente.
Agora preciso fazer uma melhoria com relação aos termos da busca.

Temos essa busca de exemplo:

Veja que estou buscando por duas palavras, bolsa e preta. Acontece que o sistema está mostrando resultados incompatíveis com a busc (mostra também em ordem decrescente de criação, o que é ok). Pelo que estou a entender, ele busca as palavras separadamente. Preciso de uma solução de melhoria pra essa busca. Tem alguma ideia? Estamos tendo problemas com cliente não encontrando os produtos aqui.

Penso eu que o sistema poderia fazer primeiro uma consulta com o termo de busca como um todo e não separadamente e depois mostrar outros resultados mais próximos de acordo com categoria / subcategoria e outros atributos relevantes do produto.

Detalhe que ele até mostra as bolsas, mas elas estão mais abaixo.

Boa tarde, tudo bem?
Você usa relevância no produto? Só pra saber antes de olharmos, porque ai teria um procedimento antes.

Matheus, blz? Então o único critério que uso foi aquele que você inseriu de ordem decrescente de busca com relação a data de criação. Penso eu que poderia tentar buscar produtos que tenham todas as palavras chaves e depois poderia vir picado conforme já está vendo mas priorizando por exemplo categoria e subcategoria e depois outras palavras chave… nessa ordem… que você acha? Pensa em algo melhor?

Vou dar uma estudada no seu caso e alguns testes aqui de pesquisa. Se puder mais exemplos vai me ajudar na solução aqui.

Matheus, peço desculpas a demora…
Termo: Slip on preto

Deveria vir primeiro slip on preto, de acordo com título e não as bolsas. Como te disse, parece que ele busca por palavras separadas, e não por termo…

No caso, teria como eu colocar uma relevância nisso? Tipo, Slip on preto… Primeiro buscar pelo conjunto inteiro: algo como um regex, quanto mais matches maior a relevância. Depois mostrar categorias e depois vir as “coisas” pretas, como bolsas e outros produtos…

Outro exemplo:
Termo: Tênis Off White

Estão vindo bolsas primeiro…

Talves Matheus eu possa estar colocando esses termos para aprimoramento de buscas nas tags dos produtos entendeu… para facilitar… o que você acha melhor?

Opa, o que eu vi aqui que pode estar bagunçando um pouco é as keywords, porque o match é feito com base nelas, além do nome do produto. Vou fazer uns testes aqui,de ao invés de considerar na busca de termo, a relevancia do nome do produto, como igual para keyword.

Bom dia. Blz?
Certo… Será que conseguimos otimizar pela quantidade de matches? Se tiver algum jeito que eu possa enviar as Tags Tb…

Boa noite, de quantidade de matches de quê exatamente? Falando em arquivo, daria pra ser feito um parse, por exemplo, zeramos as keywords. E você me faz uma lista ou te passo onde alterar, que se a pessoa pesquisar termo x, deve ser considerado y. Eu vou rodar o site e printar aqui, quando nao considera a keyword na busca por termo.


Mudei a search aqui e deu isso.

No mongo db tem vários tipo de busca, o que estava usando era match por termo. Coloquei pelo match da maioria dos termos buscados. Mantive a keyword na busca, porque vi que ela não fez diferença, avalia e me fala por favor. Agora tem um campo tbm pra você informar se a pesquisa pesquisou A, deve retornar B pelo github, caso queira, mostro pra você ou me passe uma lista

@Matheus me explica um pouco mais sobre estas opções?

Me parece que o match da maioria dos termos funcionaria melhor para mim também.

Quais outras opções que podemos utilizar? Será que hoje em dia tem alguma que funciona melhor com singular/plural/aproximações?

1 curtida

Opa, vou colocar todas opções aqui e assim ficam mais cientes, ok? Na sua loja hoje tem um misto. Vou colocar todas opções disponíveis no elastic search:

  • best_fields: Encontra documentos que correspondem a qualquer campo, mas utiliza o _score do melhor campo.
  • most_fields: Encontra documentos que correspondem a qualquer campo e combina o _score de cada campo.
  • cross_fields: Trata campos com o mesmo analisador como se fossem um único campo grande. Procura por cada palavra em qualquer campo.
  • phrase_prefix: Match no prefixo.

Vou deixar o link mais explicativo de cada uma:

Na sua loja @barradoce foi colocado prefixo, para pesquisa com termo pequeno, menor que 6 caracteres, no caso de 5 pra baixo. Acima disso, best_fields, que é o mais indicado pelo elastic que dá match por cada palavra, levando em considerção ao melhor score retornado. O score tem haver com o melhor match de palavra pesquisada e resultado

Caramba, é muito legal. Tem muito parâmetro para brincar.

No meu, estamos usando algum destes da família fuzzy, que determina sobre as trocas de caracteres?

Hoje usamos um outro método, alguns desses de troca de caracteres não funciona muito bem pra palavras em portugues por conta de no alfabeto lá não ter alguns acentos… Dai adaptamos esse método e fizemos um código pra meio que substituir ele.