2014-09-16 4 views
0

J'utilise actuellement solr pour stocker des informations de tweet publiques. J'ai un champ tel que le contenu, le sentiment, les mots-clés, tstamp, la langue, tweet_id pour capturer l'essence du tweet. J'évalue également Mongodb pour le même cas d'utilisation. J'essaie de comparer mongodb et solr ayant chacun un million de dossiers. Ce que j'ai observé est que la requête de groupe dans mongodb est 2,5 à 3 fois plus lente que la requête de facette de solr.Comment améliorer la performance des requêtes de groupe mongodb

La mongodb requête suivante

db.tweets.aggregate(
[ 
    { 
    $group : { 
     _id : "$sentiment", 
     total : { $sum : 1 } 
    } 
    } 
] 
) 

prend 481ms. J'ai index appliqué sur le champ de sentiment.

Cependant la même chose dans solr utilisant une requête facette prend 93ms.

Y a-t-il une autre configuration dans mongodb qui doit être définie de manière à améliorer les performances des requêtes de groupe dans mongodb?

Répondre

0

Un $group operation et une recherche par facette ne sont pas des opérations vraiment comparables et le $group n'utilisera pas d'index. Il semble que vous essayez de calculer le nombre de documents avec chaque valeur distincte de sentiment. MongoDB n'a pas de fonction spécifique pour cela. Pour une valeur spécifique, une meilleure opération pour obtenir le nombre serait

db.collection.count({ "sentiment" : sentiment }) 

et vous pouvez obtenir toutes les valeurs distinctes avec

db.collection.distinct("sentiment") 

deux peuvent utiliser un indice { "sentiment" : 1 }. Vous aurez besoin de plusieurs requêtes pour obtenir des comptes pour plusieurs valeurs de sentiment donc ce n'est pas aussi pratique que Solr. La recherche à facettes est une compétence de base des moteurs de recherche en texte intégral, il n'est donc pas surprenant que ce soit plus facile à Solr qu'à MongoDB. MongoDB et Solr signifiaient des utilisations totalement différentes, donc je ne peux pas dire que je verrais pourquoi vous compareriez l'un à l'autre. C'est comme courir un bateau contre une voiture.

+0

Si un champ contient, disons, par ex. 80 valeurs distinctes alors dans ce cas l'approche ci-dessus n'est pas réalisable. Corrigez-moi si je me trompe. –

+0

Droite. Ensuite, vous pouvez utiliser une agrégation comme celle ci-dessus pour la trouver, mais il n'y aura pas d'index utilisé. – wdberkeley

Questions connexes