2013-06-03 1 views
31

Ho un indice su "chiavi" di array che sto usando per fornire funzionalità di testo completo alla mia applicazione.MongoDB Ricerca di testo E più parole di ricerca

Con la versione 2.4.3, mi piacerebbe utilizzare il tipo di indice "testo". Ho assicurato un tipo di indice "di testo" sui miei "tasti" dell'array e sembra funzionare SUPER veloce (più veloce del mio vecchio metodo di testo completo per le parole chiave).

Il problema è che la mia app presuppone che i campi siano inclusivi (AND). Per impostazione predefinita, il testo cerca i miei parametri OR.

Qualcuno sa di un modo per eseguire una ricerca di testo in modo inclusivo?

Ad esempio:

db.supplies.runCommand("text", {search:"printer ink"}) 

dovrebbe restituire risultati sia con stampanti e inchiostro, invece di tutti i risultati sia con stampante o inchiostro.

+5

Gradirei davvero una soluzione che non uccida la parola derivazione. – Mitja

+2

Riesci a trovare una soluzione con la parola stemming – Zhomart

risposta

49

dare una prova di:

db.supplies.runCommand("text", {search:"\"printer\" \"ink\""}) 

Inoltre, ecco una citazione da docs:

Se la stringa di ricerca comprende le frasi, la ricerca esegue un AND con tutti gli altri termini nella ricerca stringa; per esempio. cerca "\" lo scintillio twinkle \ "piccola stella" cerca "twinkle twinkle" e ("little" o "star").

Spero che questo aiuti.

+2

tu. ROCCIA. signore. Grazie. – kmehta

+8

Si noti che questo genera interessanti caratteristiche dell'indice di testo come la parola che si verifica nel cestino. Se il mio testo è 'Queste sono alcune voci di prova interessanti qui ' , lo troverò con' {$ search: "entry"} 'ma non con' {$ search: "\" entry \ ""} '. – Mitja

+0

@Mitja Un modo per farlo senza perdere la parola stemming – Rohmer

2

si può avvolgere ogni parola tra virgolette:

let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' '); 
match.$text = { $search: keywords, $caseSensitive: false }; 

c'è un lato negativo se l'utente immette una stringa tra virgolette questo non funzionerà. Dovresti prima analizzare le stringhe citate.