Influencie a classificação dos resultados de pesquisa com pontuações de funções no Atlas Search
Avalie esse Tutorial
Quandose trata de pesquisa em linguagem natural, é útil saber como a ordem dos resultados de uma consulta foi determinada. As correspondências exatas podem ser óbvias, mas o que dizer de situações em que nem todos os resultados são correspondências exatas devido a um parâmetro difuso, ao operador
$near
ou a qualquer outra coisa?É aqui que a pontuação do documento se torna relevante.
Cada documento retornado por uma
$search
consulta no MongoDB Atlas Search recebe uma pontuação com base na relevância, e os documentos incluídos em um conjunto de resultados são retornados na ordem da pontuação mais alta para a mais baixa.Você pode optar por confiar na pontuação que o Atlas Search determina com base nos operadores de consulta ou pode personalizar seu comportamento usando a pontuação de função e otimizá-lo de acordo com suas necessidades. Neste tutorial, vamos ver como a opção
function
no Atlas Search pode ser usada para classificar resultados em um exemplo.Pela documentação, a opção
function
permite que o valor de um campo numérico altere a pontuação final do documento. Você pode especificar o campo numérico para calcular a pontuação final por meio de uma expressão. Com isso em mente, vejamos alguns cenários em que isso pode ser útil.Digamos que você tenha um sistema de avaliação como o Yelp, no qual o usuário precisa fornecer alguns critérios de pesquisa, como o tipo de comida que deseja consumir. Por padrão, você provavelmente obterá resultados com base na relevância para seu termo de pesquisa, bem como no local definido. Nos exemplos abaixo, estou usando os dados de amostra de restaurantes disponíveis no MongoDB Atlas.
A query
$search
(expressa como um pipeline de agregação) para fazer essa pesquisa no MongoDB pode ter a seguinte aparência:1 [ 2 { 3 "$search": { 4 "text": { 5 "query": "korean", 6 "path": [ "cuisine" ], 7 "fuzzy": { 8 "maxEdits": 2 9 } 10 } 11 } 12 }, 13 { 14 "$project": { 15 "_id": 0, 16 "name": 1, 17 "cuisine": 1, 18 "location": 1, 19 "rating": 1, 20 "score": { 21 "$meta": "searchScore" 22 } 23 } 24 } 25 ]
A query acima é um pipeline de agregação de dois estágios no MongoDB. A primeira etapa é pesquisar por " korean " no caminho do documento " cuisine ". Um fator difuso é aplicado à pesquisa para que erros de ortografia sejam permitidos. Os resultados do documento do primeiro estágio podem ser muito grandes, então, no segundo estágio, estamos especificando quais campos devem ser retornados para cada documento. Isso inclui uma pontuação de pesquisa que não faz parte do documento original, mas parte dos resultados da pesquisa.
Como resultado, você pode acabar com os seguintes resultados:
1 [ 2 { 3 "location": "Jfk International Airport", 4 "cuisine": "Korean", 5 "name": "Korean Lounge", 6 "rating": 2, 7 "score": 3.5087265968322754 8 }, 9 { 10 "location": "Broadway", 11 "cuisine": "Korean", 12 "name": "Mill Korean Restaurant", 13 "rating": 4, 14 "score": 2.995847225189209 15 }, 16 { 17 "location": "Northern Boulevard", 18 "cuisine": "Korean", 19 "name": "Korean Bbq Restaurant", 20 "rating": 5, 21 "score": 2.995847225189209 22 } 23 ]
A ordem padrão dos documentos retornados é baseada no valor
score
em ordem decrescente. Quanto maior a pontuação, mais próxima será a correspondência.É muito improvável que você queira comer nos restaurantes que têm uma classificação abaixo do seu limite, mesmo que eles correspondam ao termo de pesquisa e estejam dentro do local de pesquisa. Com a
function
Atlas Search, podemos atribuir um sistema de pontos à classificação e realizar alguma aritmética para dar aos restaurantes mais bem classificados um impulso em seus resultados.Vamos modificar a consulta de pesquisa para ficar assim:
1 [ 2 { 3 "$search": { 4 "text": { 5 "query": "korean", 6 "path": [ "cuisine" ], 7 "fuzzy": { 8 "maxEdits": 2 9 }, 10 "score": { 11 "function": { 12 "multiply": [ 13 { 14 "score": "relevance" 15 }, 16 { 17 "path": { 18 "value": "rating", 19 "undefined": 1 20 } 21 } 22 ] 23 } 24 } 25 } 26 } 27 }, 28 { 29 "$project": { 30 "_id": 0, 31 "name": 1, 32 "cuisine": 1, 33 "location": 1, 34 "rating": 1, 35 "score": { 36 "$meta": "searchScore" 37 } 38 } 39 } 40 ]
No pipeline de agregação de dois estágios acima, a parte em que se deve prestar atenção é a seguinte:
1 "score": { 2 "function": { 3 "multiply": [ 4 { 5 "score": "relevance" 6 }, 7 { 8 "path": { 9 "value": "rating", 10 "undefined": 1 11 } 12 } 13 ] 14 } 15 }
O que estamos dizendo nesta parte da query
$search
é que queremos pegar a pontuação de relevância que já havamos visto no exemplo anterior e multiplicá-la por qualquer valor que esteja no campo rating
do documento. Isso significa que a pontuação será potencialmente maior se a classificação do restaurante for maior. Se o restaurante não tiver uma classificação, usaremos um valor multiplicador padrão de 1.Se executarmos essa consulta nos mesmos dados de antes, agora podemos obter resultados parecidos com este:
1 [ 2 { 3 "location": "Northern Boulevard", 4 "cuisine": "Korean", 5 "name": "Korean Bbq Restaurant", 6 "rating": 5, 7 "score": 14.979236125946045 8 }, 9 { 10 "location": "Broadway", 11 "cuisine": "Korean", 12 "name": "Mill Korean Restaurant", 13 "rating": 4, 14 "score": 11.983388900756836 15 }, 16 { 17 "location": "Jfk International Airport", 18 "cuisine": "Korean", 19 "name": "Korean Lounge", 20 "rating": 2, 21 "score": 7.017453193664551 22 } 23 ]
Portanto, agora, embora "Korean BBQ Restaurant" possa estar mais longe em termos de localização, ele aparece mais alto em nosso conjunto de resultados porque a classificação do restaurante é mais alta.
Aumentar a pontuação com base na classificação é apenas um exemplo. Outro cenário poderia ser dar prioridade nos resultados de pesquisa aos restaurantes que são patrocinadores. Um multiplicador
function
poderia ser usado com base no nível de patrocínio.Vamos dar uma olhada em um caso de uso diferente. Digamos que você tenha um site de comércio eletrônico que esteja fazendo uma promoção. Para colocar os produtos de pesquisa que estão em promoção em uma posição mais alta na lista do que os itens que não estão em promoção, você pode usar uma pontuação
constant
em combinação com uma pontuação de relevância.Uma agregação que suporta o exemplo acima pode ficar assim:
1 db.products.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "should": [ 6 { 7 "text": { 8 "path": "promotions", 9 "query": "July4Sale", 10 "score": { 11 "constant": { 12 "value": 1 13 } 14 } 15 } 16 } 17 ], 18 "must": [ 19 { 20 "text": { 21 "path": "name", 22 "query": "bose headphones" 23 } 24 } 25 ] 26 } 27 } 28 }, 29 { 30 "$project": { 31 "_id": 0, 32 "name": 1, 33 "promotions": 1, 34 "score": { "$meta": "searchScore" } 35 } 36 } 37 ]);
Para entrar nos detalhes do pipeline de dois estágios acima, o primeiro estágio usa o operador composto para a pesquisa. Estamos dizendo que os resultados da pesquisa
must
satisfazem "bose headphones" e se o conjunto de resultadosshould
contiver "July4Sale" no caminho promotions
, adicione umconstant
de um à pontuação desse item de resultado específico para aumentar sua classificação.O operador
should
não exige que seu conteúdo seja satisfeito, portanto, você pode acabar com resultados de fones de ouvido que não fazem parte da "July4Sale." Esses itens de resultado simplesmente não terão sua pontuação aumentada por nenhum valor e, portanto, apareceriam mais abaixo na lista. O segundo estágio do pipeline apenas define quais campos devem existir na resposta.Ser capaz de personalizar a forma como os conjuntos de resultados de pesquisa são pontuados pode ajudá-lo a fornecer conteúdo mais relevante aos seus usuários. Embora tenhamos visto alguns exemplos da opção
function
com o operadormultiply
, existem outras maneiras de usar a pontuação da função, como substituir o valor de um campo ausente por um valor constante ou aumentar os resultados de documentos com pesquisa termos encontrados em um caminho específico. Você pode encontrar mais informações na documentação do Atlas Search.Não se esqueça de conferir os MongoDB Community para saber o que outros desenvolvedores estão fazendo com o Atlas Search.