2015-07-27 14 views
6

Quindi, secondo documenti MongoDB,MongoDB ricerca di parola completa con la frase esatta non restituire i risultati attesi

se un campo documento contiene la parola mirtillo, una ricerca sul termine blu non corrisponderà il documento

Questo è un bene per il mio caso d'uso, è ciò che voglio accadere. Tuttavia date le seguenti voci DB:

> db.test.drop() 
> db.test.insert({ "t" : "Men's Fashion" }) 
> db.test.insert({ "t" : "Women's Fashion" }) 
> db.test.ensureIndex({ "t" : "text" }) 

Una ricerca di uomini restituisce i risultati attesi:

> db.test.find({ "$text" : { "$search" : "\"Men's\"" } }, { "_id" : 0 }) 
{ "t" : "Men's Fashion" } 

Tuttavia una ricerca per la moda l'intera frase uomo, inaspettatamente restituisce anche di moda per donna:

> db.test.find({ "$text" : { "$search" : "\"Men's Fashion\"" } }, { "_id" : 0 }) 
{ "t" : "Women's Fashion" } 
{ "t" : "Men's Fashion" } 

Ho provato "\"Men's\"\"Fashion\"" con gli stessi risultati. C'è un trucco/trucco per ottenere la frase completa per restituire solo corrispondenze intere parole?

Sto usando Mongo 2.6.4. È interessante notare che segna femminile inferiore a uomini.

+1

Buona domanda. Sto vedendo lo stesso comportamento curioso usando Mongo 3.0.4. – JohnnyHK

+0

perché LA MODA DI WOMEN si abbina alla MODA UOMO ... –

risposta

2

I risultati che si vedono sono perché la MODA di WOMEN corrisponde alla MODA UOMO, nel senso che la stringa di ricerca è nella stringa da cercare.

Il comportamento partita non si verifica con questo set di dati:

/* 1 */ 
{ 
    "_id" : ObjectId("55ca6060fb286267994d297e"), 
    "text" : "potato pancake" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("55ca6075fb286267994d297f"), 
    "text" : "potato salad" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("55ca612ffb286267994d2980"), 
    "text" : "potato's pancake" 
} 

con la query

db.getCollection('rudy_test').find({$text : {"$search" : "\"potato pancake\""}}) 

E 'causata dal fatto che l'entrata contiene l'intera query, il punteggio è appena inferiore perché contiene anche altro testo. È possibile utilizzare invece Regular Expression Query (ad esempio db.test.find({t : {$regex : /^Men\'s Fashion$/}})).

+0

Jason ha esattamente ragione. La domanda è anche presente in https://jira.mongodb.org/browse/SERVER-20307 –

+0

Sì, contiene la stringa, ma dovrebbe essere esclusa dai risultati perché non corrisponde a una parola intera. O quello, o la ricerca di "\" Men's "" dovrebbe anche restituire woMEN's - ma non è così. Essenzialmente è un comportamento incoerente a seconda del numero di parole nella frase, e da quello che capisco dalla risposta di Dan nella segnalazione di bug, è in effetti un bug che è stato pianificato per essere risolto. – JBY

+0

Inoltre, l'espressione regolare non è purtroppo una soluzione adatta poiché si perdono i vantaggi della ricerca di testo (arginamento, punteggio e velocità più importanti). – JBY

Problemi correlati