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

recherche de texte mongodb en plusieurs langues

Les liens sont morts à la fois de la question et de la réponse d'origine donnée, mais il existe un moyen de définir le schéma pour cela qui est pris en charge dans les versions modernes.

La méthode recommandée serait d'inclure un "language" propriété dans le document ou les documents incorporés à côté de la propriété utilisée pour l'index de texte. Le terme "à côté" signifie au "même niveau" et non spécifiquement adjacent à la propriété dans l'index.

Quelque chose de commun ressemblerait à :

{
  "description": "Texto largo en español",
  "language": "spanish",
  "translation": [
    {
      "description": "Large text in Spanish",
      "language": "english"
    },
    {
      "description": "Grand texte en espagnol",
      "language": "french"
    }
  ]
},
{
  "description": "The quick brown fox",
  "translation": [
    {
      "description": "Le renard brun rapide",
      "language": : "french"
    }
  ]
}

Et puis en supposant que nous utilisons la langue d'indexation de texte "par défaut" de "anglais", nous pouvons simplement indexer avec :

db.collection.createIndex({ "description": "text", "translation.description": "text" })

MongoDB utilisera alors le "language" propriété comme indiqué dans le document "racine" ou à partir de "documents intégrés" dans le tableau, et là où il est omis, il utilisera simplement la valeur par défaut définie pour l'index. Par exemple, le deuxième document ici n'a pas de propriété de langue sur la "racine" donc "english" est présumé puisqu'il s'agit de la valeur par défaut sur l'index.

Les éléments indexés n'ont pas besoin d'être dans n'importe quel ordre, comme le montre également le "english" entrée à l'intérieur de "translations" tableau avec des documents incorporés par le premier exemple de document. Les règles pour les éléments intégrés diffèrent légèrement en ce sens que nous devons inclure le "language" propriétés sur les documents incorporés ou la langue réelle utilisée avec soit celle de la "racine" du document. Dans cet exemple, tout document intégré dans le tableau sans le "language" la propriété serait considérée comme utilisant "spanish" puisque c'est ce qui est défini dans la "racine".

Les recherches se font bien sûr toutes en tenant compte de tous les chemins présents dans l'index, donc à la fois sur la "description" et le "translation.description" intégré propriétés telles que définies ici. La "langue de recherche" appropriée est toujours utilisée comme spécifié avec le $language option au $text , car les "mots vides" et les "racines" sont toujours pris en compte par rapport à cela et à la langue d'indexation par défaut définie lors de la création de l'index.

Le format intégré vous donne également un point facile à partir duquel récupérer les informations de langue pour "traduire" entre deux langues où vous avez le contenu défini pour les deux langues en question, donc c'est pratique "double" dans ce cas.

La documentation spécifique se trouve désormais dans Créer un index de texte pour une collection en plusieurs langues en tant que section dans le sujet plus large de Spécifier une langue pour l'index de texte qui comprend des liens vers tous les autres détails, y compris la spécification d'une langue par défaut différente sur l'index.