2017-09-08 3 views
0

Je suis en train d'obtenir les résultats les plus pertinents de mongo, laisse dire que j'ai cette collectionCalculer résultat pertinent sur la recherche en texte intégral dans MongoDB

{ "text" : "mitsubishi lancer 2011"} 
{ "text" : "mitsubishi lancer 2011"} 
{ "text" : "mitsubishi lancer 2011 in good conditions"} 
{ "text" : "lancer 2011"} 
{ "text" : "mitsubishi lancer 2014"} 
{ "text" : "lancer 2016"} 

et de faire cette requête

db.post.find({$text: {$search: "mitsubishi lancer 2011"}}, {score: {$meta: "textScore"}}).sort({score:{$meta:"textScore"}}) 

i obtenir ce résultat

{ "text" : "mitsubishi lancer 2011", "score" : 2 } 
{ "text" : "mitsubishi lancer 2011", "score" : 2 } 
{ "text" : "mitsubishi lancer 2011 in good conditions", "score" : 1.7999999999999998 } 
{ "text" : "lancer 2011", "score" : 1.5 } 
{ "text" : "mitsubishi lancer 2014", "score" : 1.3333333333333333 } 
{ "text" : "lancer 2016", "score" : 0.75 } 

Comment puis-je savoir que les deux premiers ont tout le texte que je recherche?

pour qui le score est calculé?

Répondre

1

L'algorithme de notation est interne à MongoDB et devrait probablement changer au fil du temps, de sorte que les valeurs précises ne devraient pas avoir d'importance. Vous pouvez essayer de comprendre ce qui se passe en regardant le sources si vous voulez (même si je ne le recommanderais pas).

Le score final dépend du nombre d'occurrences de vos termes recherchés (ou plutôt de leur racine de mot), des distances entre les correspondances, de la qualité du match (match complet vs. partiel), des paramètres de langue et des poids que vous pouvez configure . Ce sont des choses assez lourdes qui ne peuvent pas être facilement documentées. Il y a, cependant, un post de blog qui explique assez bien certains aspects: https://blog.codecentric.de/en/2013/01/text-search-mongodb-stemming/ En outre, les choses deviennent un peu plus claires une fois que vous essayez différentes requêtes en utilisant différentes combinaisons de termes de recherche et de données indexées.

Enfin, si vous voulez savoir s'il y a un match parfait, la seule façon que je peux penser à faire ce travail est quelque chose comme ceci:

db.getCollection('test').aggregate(
{ 
    // do the normal filtering query 
    $match: { 
     $text: { 
      $search: "mitsubishi lancer 2011" 
     } 
    } 
}, { 
    // select what's relevant in the output and add an indicator "perfectmatch" 
    $project: { 
     "text": 1, 
     "score": { 
      $meta: "textScore" 
     }, 
     "perfectmatch": { 
      $cond: [ 
       { $eq: [ "$text", "mitsubishi lancer 2011" ] }, // this would check for a perfect match using the exact full string, for individual token matching you would need to do tokenize your query and do a series of other checks here. 
       true, 
       false 
      ] 
     } 
    } 
}, { 
    // if you want to have the results sorted by "best match first" 
    $sort: { 
     "score": -1 
    } 
})