Menschen wollen Inhalte finden. Eine gute Suche ist unerlässlich .
Volltextsuche. Verwenden nativer MongoDB-Befehle.
Beispiel-App:
Standardmäßig startet Meteor eine eigene Instanz von MongoDB. Diese verfügt nicht über eine Volltextindizierung/-suche, Sie müssen also auf nativ umsteigen .
Wenn Sie noch keine „echte“ Installation von MongoDB auf Ihrem System haben, installieren Sie sie mit HomeBrew :
brew update
brew install mongodb
Wenn Sie keinen Mac verwenden ...
Starten Sie in einem Terminal-/Konsolenfenster Ihre Mongod-Datenbank mit dem folgenden Befehl:
mongod --dbpath ~/code/meteor-search/.meteor/local/db --setParameter textSearchEnabled=true
Hinweise :
Bestätigen Sie, dass es funktioniert, indem Sie http://localhost:28017/ (in Ihrem Browser) besuchen.
Weitere Informationen zum Aktivieren der Textsuche: http://docs.mongodb.org/manual/tutorial/enable-text-search/
Da wir „echten“ Mongo verwenden, müssen wir ihn beim Starten von Meteor angeben. (Dies gilt nur, während Sie in der Produktion entwickeln. Sie würden eine ENV festlegen
)
MONGO_URL="mongodb://localhost:27017/meteor" meteor
Wenn die App ordnungsgemäß startet, läuft das Spiel !
(Ansonsten senden Sie einen Fehler an dieses Repo und ich werde versuchen, Ihnen zu helfen!)
Wenn Sie diese App starten, greift sie auf die Twitter-Streaming-API zu und ruft Tausende von Tweets ab, die Sie ( lokal ) durchsuchen können. (Lassen Sie es ein paar Minuten lang laufen und Sie erhalten 10.000 Beiträge. Oder ein paar Stunden, wenn Sie Hunderttausende Beiträge einer Stresstest-Suche unterziehen möchten.)
Wenn Sie sehr schnell VIEL Inhalt haben möchten, ändern Sie das SCHLÜSSELWORT in news .
Wenn Sie Wahnsinnige Mengen an ( verrauschten ) Daten wünschen (um ein hohes Volumen zu simulieren), verwenden Sie:
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
Sobald Sie Inhalte haben, müssen Sie sicherstellen, dass MongoDB diese indiziert.
Glücklicherweise ist dies mit der „sureIndex“ -Methode von MongoDB recht einfach . In unserem Fall indizieren wir einfach das Textfeld des Beitrags:
db.posts.ensureIndex( { body: "text" },{ background:true } );
Es gibt ein Startskript , das dies automatisch für Sie erledigt: server/indexes.js
Abhängig davon, wie viele Daten Sie bereits eingegeben haben, kann dies einige Zeit dauern ... Ich hatte 92.000 Beiträge (Tweets) in meiner Datenbank, als ich es ausführte, und es dauerte weniger als 10 Sekunden!
Weitere Details zu secureIndex :
db.posts.runCommand( "text", { search: "paypal" } )
Während dies in RoboMongo gut funktioniert:
Meteor unterstützt die runCommand -Methode nicht:
Also ...
http://stackoverflow.com/questions/17159626/implementing-mongodb-2-4s-full-text-search-in-a-meteor-app/18258688#18258688
Ich habe einen einfachen regulären Ausdruck geschrieben, um mit Hashtags versehene Schlüsselwörter in Links umzuwandeln. Anstatt die Rohdaten mit Links zu verunreinigen (und unsere Datensätze aufzublähen), finden/ersetzen wir die #keywords zum Zeitpunkt des Renderns (clientseitig) mithilfe einer Helfer-Methode für die Vorlage von Handlers:
// 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;
});
Hinweis : Das Linkmuster ist hartcodiert /search/:keywords
und die Methode ist nicht verkettbar, also alles andere als perfekt ! Senden Sie eine Pull-Anfrage, wenn Sie Verbesserungen vornehmen. :-)
In MongoHQ ist die (Voll-)Textindizierung standardmäßig nicht aktiviert.
Aber sie haben mir schnell geholfen, als ich darum gebeten habe: https://twitter.com/nelsonic/statuses/451758108285489152
Sie müssen Ihre Indizes manuell mit einem Befehl einrichten
(entweder in Ihrem Mongo-Client – Wir verwenden RoboMongo – oder im Webinterface)
Sobald das eingerichtet ist, kann es losgehen.
Verwenden Sie in RoboMongo (oder einem anderen MongoDB-Client Ihrer Wahl) den folgenden Befehl, um Ihre Sammlung zu durchsuchen (in den Feldern, die Sie als durchsuchbar angegeben haben).
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
Suchergebnisse wurden in 0,15 Sekunden zurückgegeben, als ich 327.000 Beiträge in der Sammlung hatte:
Dieses Projekt verwendet Iron Router für das URL-Routing.
Wenn Sie damit nicht vertraut sind ( das sollten Sie tun, wenn Sie Meteor ernsthaft nutzen möchten), lesen Sie:
mrt add iron-router
In der Datei „routes.js“ finden Sie weitere Einzelheiten dazu, wie ich dies so konfiguriert habe, dass die Anfrage im Formular angenommen wird: http://yoursite.com/search/:keywords