2011-10-10 15 views
13

Nella sintassi di "db.foo.find()" di MongoDB, come posso dire che corrisponde a tutte le lettere e alle loro versioni accentate?Caratteri accentati della corrispondenza Mongodb come carattere sottostante

Per esempio, se ho un elenco di nomi nel mio database:
João
François
Jesús

Come faccio a permettere una ricerca per le stringhe "Joao", "Francois", o " Gesù "per abbinare il nome dato?
Spero che io non devo fare una ricerca come questo ogni volta:
db.names.find({name : /Fr[aã...][nñ][cç][all accented o characters][all accented i characters]s/ })

risposta

9

Come di Mongo 3.2, è possibile utilizzare $text e impostare $diacriticSensitive su false:

{ 
    $text: 
    { 
     $search: <string>, 
     $language: <string>, 
     $caseSensitive: <boolean>, 
     $diacriticSensitive: <boolean> 
    } 
} 

Scopri di più la documentazione Mongo: https://docs.mongodb.com/manual/reference/operator/query/text/

+3

Penso che questo guadagni la migliore risposta, 5 anni dopo, per una funzionalità che non esisteva quando ho posto la domanda. Non sto più lavorando al progetto in questione, ma mi fiderò che questo faccia ciò che volevo. – Josh

0

Sembra più come ricerca fuzzy di corrispondenza che MongoDB non supporta attualmente. Quello che puoi provare è:

/1. Memorizza le varianti del nome in un elemento separato nella raccolta per ogni voce. Quindi è possibile eseguire la query trovando se il termine di ricerca esiste all'interno dell'array delle varianti.

o

/2. Conservare la stringa soundex per ciascuno dei nomi nella stessa collezione. Quindi, per la stringa di ricerca, ottenere una stringa soundex e interrogare il database, si otterrà il risultato che ha il risultato simile Soundex alla query. È possibile filtrare e verificare i dati più nello script. esempio:

codice Soundex per François = F652, codice Soundex per Francois = F652

codice Soundex per Jesús = J220, codice Soundex per Gesù = J220

Controlla il resto qui: http://creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm#SoundExConverter

+0

Variazioni non funzioneranno, perché se ho un nome con accenti multipli Non voglio dover memorizzare tutte le permutazioni di caratteri accentati e non accentati. Soundex sembra interessante. Ma nessuno dei due fa esattamente quello che voglio. Speravo in "trattare i personaggi accentati come il loro personaggio base" bandiera regex magica o qualcosa del genere ... Se questo non esiste, allora penso che dovrò semplicemente modificare la regex a livello di codice prima che arrivi a mongo. – Josh

+0

È possibile trovare una soluzione qui: http://stackoverflow.com/questions/1890854/how-to-replace-special-characters-with-the-ones-theyre-based-on-in-php – DhruvPathak

8

Suggerisco di aggiungere un campo indicizzato come NameSearchable di stringhe semplificate, ad es.

  • João -> JOAO
  • François -> FRANCOIS
  • Jesús -> GESU
  • Jürgen -> JUERGEN

La stessa mappatura che viene utilizzato durante l'inserimento di nuovi elementi nel database può essere usato durante la ricerca. La stringa originale con custodia e accenti corretti verrà conservata.

La cosa più importante è che la query può utilizzare l'indicizzazione. Le query senza distinzione tra maiuscole e minuscole e le query regex non possono utilizzare gli indici (con l'eccezione delle espressioni regolari con radice) e crescono in modo proibitivo su grandi raccolte.

Oh, e dal momento che le stringhe semplificate possono essere create dalle stringhe originali, non è un problema aggiungere questo alle raccolte esistenti.

+0

Questo suggerimento rende molto di senso Avete qualche frammento che lo supporta? – elhoyos

+1

Questo purtroppo dipende dal linguaggio di programmazione. http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net illustra diversi modi per farlo in C#, http: // stackoverflow. it/questions/990904/javascript-remove-accents-diacritics-in-string contiene frammenti JavaScript (ma l'approccio è diverso) – mnemosyn

+1

Ho fatto una semplice implementazione di questo per gli utenti del nodo: https://github.com/weisjohn/mongoose -latinize – weisjohn

Problemi correlati