mongoose-search-plugin

mongoose full-text search plugin

Mongoose full-text search plugin

Simple mongoose plugin for full text search. Uses natural stemming and distance algorythms.

  var mongoose = require('mongoose'),
    searchPlugin = require('mongoose-search-plugin');
 
  var Schema = mongoose.Schema({
    title: String,
    descirption: String,
    tags: [String]
  });
 
  Schema.plugin(searchPlugin, {
    fields: ['title', 'description', 'tags']
  });
 
  var Model = mongoose.model('MySearchModel', Schema);
  Model.search('some query', {title: 1}, {
    conditions: {title: {$exists: true}},
    sort: {title: 1},
    limit: 10
  }, function(errdata) {
    // array of finded results 
    console.log(data.results);
    // count of all matching objects 
    console.log(data.totalCount);
  });
  $ npm install mongoose-search-plugin --save

plugin accepts options argument with following format:

  var options = {
    keywordsPath: '_keywords', // path for keywords, `_keywords` as default 
    relevancePath: '_relevance', // path for relevance number, '_relevance' as default 
    fields: [], // array of fields to use as keywords (can be String or [String] types), 
    stemmer: 'PorterStemmer', // natural stemmer, PorterStemmer as default 
    distance: 'JaroWinklerDistance' // distance algorythm, JaroWinklerDistance as default 
  };
  Schema.plugin(searchPlugin(options));

Model.search(query, fields, options, callback) options are optional. Method will return object of the following format:

  {
    results: [], // array of results objects 
    totalCount: 0 // number of objects, that matched criteries 
  }

Options has following format:

  {
    conditions: {}, // criteria for query 
    sort: {} // sorting parameters 
    populate: [{path: '', fields: ''}], // array of paths to populate 
    ... and other options of Model.find method
  }

By default results sorts by relevance field, that defined in relevancePath plugin option.

If You start using plugin on existing database to initialize keywords field in object use setKeywords method.

  Model.setKeywords(function(err) {
    // ... 
  });