MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Implementacja wyszukiwania pełnotekstowego MongoDB 2.4 w aplikacji Meteor

Najprostszym sposobem bez edycji kodu Meteora jest użycie własnego mongodb. Twój mongodb.conf powinien wyglądać mniej więcej tak (w Arch Linux można go znaleźć w /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

Kluczowa linia to setParameter = textSearchEnabled=true , co, jak mówi, umożliwia wyszukiwanie tekstu.

Uruchom mongod w górę

Powiedz meteorowi, żeby użył twojego mongod nie własny, określając MONGO_URL zmienna środowiskowa.

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

Teraz powiedz, że masz kolekcję o nazwie Dinosaurs zadeklarowane powiedz w collections/dinosaurs.js

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

Aby utworzyć indeks tekstowy dla kolekcji, utwórz plik 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
    });
});

Następnie możesz ujawnić wyszukiwanie za pomocą Meteor.method , na przykład w pliku 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;
    }
};

Następnie możesz publikować tylko dokumenty, które zostały wyszukane w 'server/publications.js'

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

Subskrypcja po stronie klienta wyglądałaby mniej więcej tak w client/main.js

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

Rekwizyty dla Timo Brinkmanna którego projekt musiccrawler był źródłem większości tej wiedzy.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak przekonwertować ciąg na objectId w LocalField dla $lookup Mongodb

  2. Aktualizacja i wyszukiwanie struktury osadzania Mongodb?

  3. Kolekcja fragmentaryczna MongoDB nie jest ponownie równoważona

  4. Strategie publikowania/subskrybowania przez Meteor dla unikalnych kolekcji po stronie klienta

  5. PyMongo/Mongoengine odpowiednik mongodump