MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Внедряване на пълнотекстово търсене на MongoDB 2.4 в приложение Meteor

Най-простият начин, без да редактирате код на Meteor, е да използвате свой собствен mongodb. Вашият mongodb.conf трябва да изглежда нещо подобно (на Arch Linux се намира в /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

Ключовият ред е setParameter = textSearchEnabled=true , което, както се посочва, позволява търсене на текст.

Стартирайте mongod нагоре

Кажете на meteor да използва вашия mongod не е собствено чрез посочване на MONGO_URL променлива на околната среда.

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

Сега кажете, че имате колекция, наречена Dinosaurs декларирани да речем в collections/dinosaurs.js

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

За да създадете текстов индекс за колекцията, създайте файл 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
    });
});

След това можете да изложите търсенето чрез Meteor.method , например във файла 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;
    }
};

След това можете да публикувате само документи, които са били търсени в 'server/publications.js'

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

И абонаментът от страна на клиента би изглеждал нещо подобно в client/main.js

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

Реквизити за Тимо Бринкман чийто проект за musiccrawler беше източникът на повечето тези знания.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. актуализация на MongoDB()

  2. Django admin и MongoDB, възможно ли е изобщо?

  3. Pymongo cursor limit(1) връща повече от 1 резултат

  4. TypeError:Не може да се прочете свойство 'items' на null в monogdb с помощта на nodejs

  5. Въведение в основите на MongoDB Zone