MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Implémentation de la recherche en texte intégral de MongoDB 2.4 dans une application Meteor

Le moyen le plus simple sans modifier aucun code Meteor est d'utiliser votre propre mongodb. Votre mongodb.conf devrait ressembler à ceci (sur Arch Linux, il se trouve dans /etc/mongodb.conf )

bind_ip = 127.0.0.1
quiet = true
dbpath = /var/lib/mongodb
logpath = /var/log/mongodb/mongod.log
logappend = true
setParameter = textSearchEnabled=true

La ligne clé est setParameter = textSearchEnabled=true , qui, comme il est indiqué, permet la recherche de texte.

Démarrer mongod vers le haut

Dites à meteor d'utiliser votre mongod pas le sien en spécifiant le MONGO_URL variable d'environnement.

MONGO_URL="mongodb://localhost:27017/meteor" meteor

Supposons maintenant que vous ayez une collection appelée Dinosaurs déclaré dire dans collections/dinosaurs.js

Dinosaurs = new Meteor.Collection('dinosaurs');

Pour créer un index de texte pour la collection, créez un fichier server/indexes.js

Meteor.startUp(function () {
    search_index_name = 'whatever_you_want_to_call_it_less_than_128_characters'

    // Remove old indexes as you can only have one text index and if you add 
    // more fields to your index then you will need to recreate it.
    Dinosaurs._dropIndex(search_index_name);

    Dinosaurs._ensureIndex({
        species: 'text',
        favouriteFood: 'text'
    }, {
        name: search_index_name
    });
});

Ensuite, vous pouvez exposer la recherche via un Meteor.method , par exemple dans le fichier server/lib/search_dinosaurs.js .

// Actual text search function
_searchDinosaurs = function (searchText) {
    var Future = Npm.require('fibers/future');
    var future = new Future();
    Meteor._RemoteCollectionDriver.mongo.db.executeDbCommand({
        text: 'dinosaurs',
        search: searchText,
        project: {
          id: 1 // Only take the ids
        }
     }
     , function(error, results) {
        if (results && results.documents[0].ok === 1) {
            future.ret(results.documents[0].results);
        }
        else {
            future.ret('');
        }
    });
    return future.wait();
};

// Helper that extracts the ids from the search results
searchDinosaurs = function (searchText) {
    if (searchText && searchText !== '') {
        var searchResults = _searchEnquiries(searchText);
        var ids = [];
        for (var i = 0; i < searchResults.length; i++) {
            ids.push(searchResults[i].obj._id);
        }
        return ids;
    }
};

Ensuite, vous pouvez publier uniquement les documents qui ont été recherchés dans 'server/publications.js'

Meteor.publish('dinosaurs', function(searchText) {
    var doc = {};
    var dinosaurIds = searchDinosaurs(searchText);
    if (dinosaurIds) {
        doc._id = {
            $in: dinosaurIds
        };
    }
    return Dinosaurs.find(doc);
});

Et l'abonnement côté client ressemblerait à ceci dans client/main.js

Meteor.subscribe('dinosaurs', Session.get('searchQuery'));

Props à Timo Brinkmann dont le projet musiccrawler était la source de la plupart de ces connaissances.