sql >> Databáze >  >> NoSQL >> MongoDB

Implementace fulltextového vyhledávání MongoDB 2.4 v aplikaci Meteor

Nejjednodušší způsob bez úpravy jakéhokoli kódu Meteoru je použít vlastní mongodb. Váš mongodb.conf by měl vypadat nějak takto (na Arch Linuxu se nachází na /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

Klíčový řádek je setParameter = textSearchEnabled=true , který, jak je uvedeno, umožňuje textové vyhledávání.

Spusťte mongod nahoru

Řekněte meteoru, aby použil vašeho mongod není vlastní zadáním MONGO_URL proměnná prostředí.

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

Nyní řekněme, že máte sbírku nazvanou Dinosaurs deklarováno v collections/dinosaurs.js

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

Chcete-li vytvořit textový index pro kolekci, vytvořte soubor 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
    });
});

Poté můžete vystavit vyhledávání pomocí Meteor.method , například v souboru 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;
    }
};

Poté můžete publikovat pouze dokumenty, které byly vyhledávány v 'server/publications.js'

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

A předplatné na straně klienta by v client/main.js vypadalo nějak takto

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

Rekvizity pro Timo Brinkmann jehož projekt musiccrawler byl zdrojem většiny těchto znalostí.



  1. 3 způsoby, jak vypustit index v MongoDB

  2. Konfigurace reverzního proxy serveru Apache pro hostování serveru Laravel Echo na produkci

  3. Jak nakonfigurovat zdroj dat StrongLoop LoopBack MongoDB pro nasazení do Heroku

  4. Ukládání numpy pole v mongodb