2015-02-27 7 views
36

Sto cercando su Google da giorni e ho provato molte cose, ma non riesco ancora a eseguire una buona ricerca di testo completo sulla mia collezione di utenti.Il modo migliore per eseguire una ricerca a testo completo in MongoDB e Mongoose

ho provato elasticsearch ma era abbastanza impossibile per interrogare e impaginare ...

ho provato molti plugin per Mongoose come ElMongo, mangusta-full-text, Mongoosastic, ecc ... tutti sono davvero male mi sono documentato e non so come eseguire una buona ricerca a tutto testo.

Quindi, la mia collezione è un insieme normale:

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

Ho un input di ricerca in una pagina con un semplice POST, se di tipo I hello world quello che mi serve è quello di cercare l'intera collezione i campi di corrispondenza parole della mia query di ricerca e ottenere i risultati.

Sarà davvero bello anche avere opzioni per gestire un'impaginazione come 10 articoli per pagina o qualcosa del genere ...

Qual è la soluzione migliore per raggiungere questo obiettivo? Sto usando MongoDB 2.6. * Con Mongoose, NodeJS e ExpressJS.

Grazie.

risposta

65

È possibile aggiungere un text index alla definizione dello schema Mongoose che consente di utilizzare l'operatore $text nelle query find per cercare tutti i campi inclusi nell'indice di testo.

Per creare un indice per sostenere ricerca, diciamo, name e profile.something:

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

Oppure, se si desidera includere tutti i campi stringa nell'indice, utilizzare il '$**' jolly:

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

Ciò consentirebbe di eseguire una query di ricerca di testo a pagine come:

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

Per ulteriori dettagli, leggere la documentazione completa MongoDB Text Indexes.

+0

Grazie per la risposta. Non riduce le prestazioni di MongoDB facendo questo? Un'altra domanda per favore: posso anche scegliere i campi da indicizzare? –

+1

@AyeyeBrazo Ho aggiornato l'anser per mostrare come scegliere i campi da indicizzare. L'aggiunta di qualsiasi indice aggiunge un sovraccarico durante gli inserimenti e gli aggiornamenti, nonché i requisiti di archiviazione aggiunti, in modo che sia sempre necessario prendere in considerazione. – JohnnyHK

+1

dopo una lunga ricerca, la tua risposta è re! –

-9

Per la query di ricerca è possibile utilizzare il plug-in Elasticsearch. In Elasticsearch puoi creare una query di ricerca personalizzata per cercare qualsiasi testo e stringa specifici con la durata temporale specificata in tempo reale.

Ma prima devi fare l'indicizzazione dei documenti json residenti in MongoDB. Devi connettere MongoDB con il server Elasticsearch. Quindi usando la funzionalità fluviale di Elasticsearch devi fare l'indicizzazione nel server Elasticsearch dei tuoi dati, quindi solo tu puoi fare la tua query personalizzata per la ricerca.

Problemi correlati