sql >> Base de Datos >  >> NoSQL >> MongoDB

búsqueda de texto mongodb usando múltiples idiomas

Los enlaces están muertos tanto en la pregunta como en la respuesta original dada, pero hay una manera de definir el esquema para esto que es compatible en versiones modernas.

La forma recomendada sería incluir un "language" propiedad en el documento o documentos incrustados junto a la propiedad que se utiliza para el índice de texto. El término "junto a" significa en el "mismo nivel" y no específicamente adyacente a la propiedad en el índice.

Algo común se vería así:

{
  "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"
    }
  ]
}

Y luego, suponiendo que usamos el idioma de índice de texto "predeterminado" de "inglés", simplemente podemos indexar con:

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

MongoDB luego usará el "language" propiedad como se muestra en el documento "raíz" o desde "documentos incrustados" en la matriz, y donde se omite, simplemente usará el valor predeterminado definido para el índice. Por ejemplo, el segundo documento aquí no tiene propiedad de idioma en la "raíz", por lo que "english" se presume ya que es el valor predeterminado en el índice.

Los elementos indexados no necesitan estar en ningún orden, como también se demuestra al tener el "english" entrada dentro de "translations" matriz con documentos incrustados por el primer documento de muestra. Las reglas para elementos incrustados difieren ligeramente en que debemos incluir el "language" propiedades en los documentos incrustados o el idioma real utilizado con el del documento "raíz". En este ejemplo, cualquier documento incrustado en la matriz sin el "language" se consideraría que la propiedad está usando "spanish" ya que eso es lo que está definido en la "raíz".

Por supuesto, todas las búsquedas se realizan teniendo en cuenta todas las rutas presentes en el índice, por lo que tanto en "description" y el "translation.description" incrustado propiedades como se definen aquí. El "idioma de búsqueda" apropiado todavía se usa siempre como se especifica con el $language opción al $text operador, ya que las "palabras vacías" y la "derivación" todavía se consideran en relación con esto y el idioma de índice predeterminado establecido en la creación del índice.

El formato incrustado también le brinda un punto fácil desde el cual recuperar la información del idioma para "traducir" entre dos idiomas donde tiene el contenido definido para ambos idiomas en cuestión, por lo que su practicidad es "doble" en este caso.

La documentación específica ahora se encuentra en Crear un índice de texto para una colección en varios idiomas como una sección dentro del tema más amplio de Especificar un idioma para el índice de texto que incluye enlaces a todos los demás detalles, incluida la especificación de un idioma predeterminado diferente en el índice.