Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Influencie a classificação dos resultados de pesquisa com pontuações de funções no Atlas Search

Nic Raboy5 min read • Published Jul 09, 2021 • Updated Feb 03, 2023
AtlasPesquisaJavaScript
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
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$nearou 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çãofunction no Atlas Search pode ser usada para classificar resultados em um exemplo.
Pela documentação, a opçãofunction 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 valorscore 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 multiplicadorfunctionpoderia 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çãoconstantem combinação com uma pontuação de relevância.
Uma agregação que suporta o exemplo acima pode ficar assim:
1db.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 operadorshouldnã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.

Conclusão

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çãofunction 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.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Otimize com o MongoDB Atlas: Performance Advisor, analisador de queries e muito mais


Jan 30, 2024 | 6 min read
Tutorial

Desbloqueando a pesquisa semântica: crie um mecanismo de pesquisa de filmes baseado em Java com o Atlas Vector Search e o Spring Boot


Sep 18, 2024 | 10 min read
Tutorial

Como desenvolver um aplicativo web com funções sem servidor da Netlify e MongoDB


Aug 30, 2024 | 6 min read
Início rápido

Integração do Atlas Search com o BuildSship


Oct 15, 2024 | 4 min read
Sumário
  • Conclusão