Les gens veulent trouver du contenu. Une bonne recherche est essentielle .
Recherche en texte intégral. Utilisation des commandes natives MongoDB.
Exemple d'application :
Par défaut, Meteor démarre sa propre instance de MongoDB, celle-ci n'a pas d'indexation/recherche en texte intégral, vous devez donc passer au natif .
Si vous n'avez pas déjà une "vraie" installation de MongoDB sur votre système, installez-la avec HomeBrew :
brew update
brew install mongodb
Si vous n'utilisez pas Mac...
Dans une fenêtre de terminal/console, démarrez votre base de données mongod avec la commande suivante :
mongod --dbpath ~/code/meteor-search/.meteor/local/db --setParameter textSearchEnabled=true
Remarques :
Confirmez son fonctionnement en visitant : http://localhost:28017/ (dans votre navigateur)
Plus d'informations sur l'activation de la recherche de texte : http://docs.mongodb.org/manual/tutorial/enable-text-search/
Parce que nous utilisons le "vrai" Mongo, nous devons le spécifier lors du démarrage de Meteor. (Cela ne s'applique que pendant que vous développez en production, vous définiriez un ENV
)
MONGO_URL="mongodb://localhost:27017/meteor" meteor
Si l'application démarre correctement, le jeu est lancé !
(sinon soumettez un bug à ce dépôt et j'essaierai de vous aider !)
Lorsque vous démarrez cette application, elle accédera à l'API Twitter Streaming et récupérera des milliers de tweets dans lesquels vous pourrez effectuer une recherche ( localement ). (laissez-le fonctionner pendant quelques minutes et vous obtiendrez 10 000 messages. Ou quelques heures si vous voulez que des centaines de milliers de personnes testent la recherche)
Si vous voulez BEAUCOUP de contenu très rapidement, remplacez le MOT-CLÉ par news .
Si vous voulez des quantités INSANE de données ( bruyantes ) (pour simuler un volume élevé ), utilisez :
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
Une fois que vous avez du contenu, vous devez vous assurer que MongoDB l'indexe.
Heureusement, c'est assez simple avec la méthode EnsureIndex de MongoDB. Dans notre cas nous allons simplement indexer le champ body du post :
db.posts.ensureIndex( { body: "text" },{ background:true } );
Il existe un script de démarrage qui fait cela automatiquement pour vous sur : server/indexes.js
En fonction de la quantité de données que vous avez déjà insérées, cela peut prendre un certain temps... J'avais 92 000 messages (tweets) dans ma base de données lorsque je l'ai exécuté et cela a pris moins de 10 secondes !
Plus de détails sur EnsureIndex :
db.posts.runCommand( "text", { search: "paypal" } )
Bien que cela fonctionne bien dans RoboMongo :
Meteor ne prend pas en charge la méthode runCommand :
Donc ...
http://stackoverflow.com/questions/17159626/implementing-mongodb-2-4s-full-text-search-in-a-meteor-app/18258688#18258688
J'ai écrit une expression régulière simple pour transformer les mots-clés hashtaggés en liens. Au lieu de polluer les données brutes avec des liens (et de gonfler nos enregistrements), nous trouvons/remplaceons les #mots-clés au moment du rendu (côté client) à l'aide d'une méthode d'assistance de modèle de guidon :
// place this code in your main.js or inside an Meteor.isClient block
Handlebars.registerHelper('highlight', function(text) {
var hashtagPattern = /s*(#w*)/gi,
link = "/search/",
m, match, matches = [], t, url ='';
// initial check for hashtag in text
if(text.indexOf("#") !== -1) {
// find all #keywords (that have hashtags)
while ( (match = hashtagPattern.exec(text)) ) {
matches.push(match[0]);
}
// replace any #keywords with <a href="/search/keywords">#keywords</a>
for(var j=0; j < matches.length; j++) {
m = matches[j].replace(/s/g, "");
// console.log('match',m);
url = link+m;
url = url.replace('#',"").toLowerCase(); // remove hashtag for lookup
t = " <a class='hashtag' href='"+url+"'>"+m+"</a> "; // replace with
replace = new RegExp("\s*("+m+")", 'gi');
text = text.replace(replace, t);
}
}
return text;
});
Remarque : le modèle de lien est codé en dur /search/:keywords
et la méthode n'est pas chaînable, donc loin d'être parfaite ! Envoyez une pull-request si vous l’améliorez. :-)
MongoHQ n'a pas d'indexation de texte (complète) activée par défaut .
Mais ils n'ont pas tardé à m'aider lorsque je l'ai demandé : https://twitter.com/nelsonic/statuses/451758108285489152
Vous devrez configurer vos index manuellement avec une commande
(soit dans votre client Mongo - Nous utilisons RoboMongo - soit dans l'interface Web)
Une fois que cela est configuré, vous êtes prêt à partir.
Dans RoboMongo (ou quel que soit le client MongoDB de votre choix), utilisez la commande suivante pour effectuer une recherche dans votre collection (sur le(s) champ(s) que vous avez spécifié comme pouvant faire l'objet d'une recherche)
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
Les résultats de recherche sont retournés en 0,15 seconde alors que j'avais 327 000 publications dans la collection :
Ce projet utilise Iron Router pour le routage des URL.
Si vous ne le connaissez pas (vous devriez l'être si vous envisagez sérieusement d'utiliser Meteor), lisez :
mrt add iron-router
Consultez le fichier routes.js pour plus de détails sur la façon dont j'ai configuré cela pour accepter la demande sous la forme : http://yoursite.com/search/:keywords