Estoy buscando en Google desde hace días y probé muchas cosas, pero todavía no puedo realizar una buena búsqueda de texto completo en mi colección de usuarios.
Probé ElasticSearch pero era bastante imposible consultar y paginar...
Probé muchos complementos para Mongoose como ElMongo, mongoose-full-text, Mongoosastic, etc... todos están muy mal documentados y no sé cómo realizar una buena búsqueda de texto completo.
Entonces, mi colección es una colección normal:
user = { name: String, email: String, profile: { something: String, somethingElse: String } } Tengo una entrada de búsqueda en una página con un POST simple, si escribo hello world , lo que necesito es buscar en todos los campos de la colección las palabras coincidentes de mi consulta de búsqueda y obtener los resultados.
Sería muy bueno también tener opciones para manejar una paginación como 10 elementos por página o algo así...
¿Cuál es la mejor solución para lograr esto? Estoy usando MongoDB 2.6.* con Mongoose, NodeJS y ExpressJS.
Gracias.
Puede agregar un índice de texto a su definición de esquema Mongoose que le permite usar el operador$text en sus consultas de búsqueda para find todos los campos incluidos en el índice de texto.
Para crear un índice que admita la búsqueda de texto en, por ejemplo, name y profile.something :
var schema = new Schema({ name: String, email: String, profile: { something: String, somethingElse: String } }); schema.index({name: 'text', 'profile.something': 'text'}); O si desea incluir todos los campos de cadena en el índice, use el comodín '$**' :
schema.index({'$**': 'text'});Esto le permitiría realizar una consulta de búsqueda de texto paginado como:
MyModel.find({$text: {$search: searchString}}) .skip(20) .limit(10) .exec(function(err, docs) { ... });Para obtener más detalles, lea la documentación completa de los índices de texto de MongoDB .
Esta no es una respuesta adicional sino un complemento, pero si la respuesta anterior de JohnnyHK le da una matriz vacía [] .
Pruebe algo básico primero sin limit y skip
const results = await MyModel.find({ $text: { $search: "text" } });
Verifique si el índice se creó correctamente usando mongosh usando db.stories.getIndexes() o la GUI de la brújula, ambas adjuntas. De lo contrario, cree uno a través de COMPASS GUI o a través de mongosh usandodocumentos
searchText varias veces e intente.