MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

La recherche MongoDB diacriticInSensitive n'affiche pas toutes les lignes accentuées (mots avec signe diacritique) comme prévu et vice-versa

Depuis mongodb 3.2 , index de texte sont insensibles aux signes diacritiques :

Avec la version 3, l'index de texte est insensible aux signes diacritiques. C'est-à-dire que l'index ne fait pas la distinction entre les caractères qui contiennent des signes diacritiques et leurs homologues non marqués, tels que é, ê et e. Plus précisément, l'index de texte supprime les caractères classés comme diacritiques dans la liste des propriétés de la base de données de caractères Unicode 8.0.

La requête suivante devrait donc fonctionner :

db.Collection.find( { $text: { $search: "iphone"} } );
db.Collection.find( { name: { $regex: "iphone"} } );

mais il semble qu'il y ait un bogue avec diérésis ( ¨ ), même s'il est classé comme diacritique dans la liste unicode 8.0 (problème sur JIRA :SERVER-29918 )

Solution

depuis mongodb 3.4 vous pouvez utiliser la collation qui permet d'effectuer ce genre de requête :

par exemple, pour obtenir le résultat attendu, exécutez la requête suivante :

db.Collection.find({name: "iphone"}).collation({locale: "en", strength: 1})

cela affichera :

{ "_id" : 1, "name" : "iphone" }
{ "_id" : 2, "name" : "iphône" }
{ "_id" : 3, "name" : "iphonë" }
{ "_id" : 4, "name" : "iphônë" }

dans le classement, strength est le niveau de comparaison à effectuer

  • 1 :caractère de base uniquement
  • 2 :sensible aux signes diacritiques
  • 3 :sensible à la casse + sensible aux signes diacritiques