web-dev-qa-db-fra.com

Meilleure façon d'effectuer une recherche en texte intégral dans MongoDB et Mongoose

Je cherche sur Google depuis des jours et j'ai essayé beaucoup de choses, mais je ne peux toujours pas effectuer une bonne recherche en texte intégral sur ma collection d'utilisateurs.

J'ai essayé ElasticSearch mais il était pratiquement impossible d'interroger et de paginer ...

J'ai essayé beaucoup de plugins pour Mongoose comme ElMongo, Mangouste en texte intégral, Mongoosastic, etc. Tout le monde est vraiment mal documenté et je ne sais pas comment effectuer une bonne recherche en texte intégral.

Donc, ma collection est une collection normale:

user = {
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
}

J'ai une entrée de recherche dans une page avec un simple POST, si je tape hello world j’ai besoin de chercher dans les champs de la collection entière les mots correspondants de ma requête et d’obtenir les résultats.

Ce sera vraiment bien d'avoir aussi des options pour gérer une pagination comme 10 éléments par page ou quelque chose comme ça ...

Quelle est la meilleure solution pour y parvenir? J'utilise MongoDB 2.6. * Avec Mongoose, NodeJS et ExpressJS.

Merci.

62
Ayeye Brazo

Vous pouvez ajouter un index de texte à votre définition de schéma Mongoose qui vous permet d’utiliser le $text opérateur dans vos requêtes find pour rechercher tous les champs inclus dans l'index de texte.

Pour créer un index prenant en charge la recherche de texte sur, par exemple, name et profile.something:

var schema = new Schema({
  name: String,
  email: String,
  profile: {
    something: String,
    somethingElse: String
  }
});
schema.index({name: 'text', 'profile.something': 'text'});

Ou si vous souhaitez inclure tous les champs de chaîne dans l'index, utilisez la commande '$**' joker:

schema.index({'$**': 'text'});

Cela vous permettrait d'effectuer une requête de recherche de texte paginé comme:

MyModel.find({$text: {$search: searchString}})
       .skip(20)
       .limit(10)
       .exec(function(err, docs) { ... });

Pour plus de détails, lisez la documentation complète Index de texte MongoDB .

133
JohnnyHK