MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongodb ricerca di testo utilizzando più lingue

I collegamenti sono morti sia dalla domanda che dalla risposta originale data, ma c'è un modo per definire lo schema per questo che è supportato nelle versioni moderne.

Il modo consigliato sarebbe includere una "language" proprietà nel documento o documenti incorporati accanto alla proprietà utilizzata per l'indice di testo. Il termine "accanto a" significa allo "stesso livello" e non specificamente adiacente alla proprietà nell'indice.

Qualcosa di comune sarebbe simile a:

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

E quindi supponendo di utilizzare la lingua "predefinita" dell'indice di testo di "inglese", possiamo semplicemente indicizzare con:

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

MongoDB utilizzerà quindi il "language" proprietà come mostrato nel documento "root" o da "documenti incorporati" nell'array e, se omesso, utilizzerà semplicemente il valore predefinito definito per l'indice. Ad esempio, il secondo documento qui non ha proprietà language su "root", quindi "english" si presume poiché è l'impostazione predefinita sull'indice.

Gli elementi indicizzati non devono essere in alcun ordine, come dimostrato anche dall'avere il "english" voce all'interno del "translations" array con documenti incorporati dal primo documento di esempio. Le regole per gli elementi incorporati differiscono leggermente in quanto dobbiamo includi il "language" proprietà sui documenti incorporati o la lingua effettiva utilizzata con quella della "radice" del documento. In questo esempio qualsiasi documento incorporato nell'array senza il "language" si considera che la proprietà stia utilizzando "spanish" poiché questo è ciò che è definito nella "radice".

Le ricerche ovviamente sono tutte fatte in considerazione di tutti i percorsi presenti nell'indice, quindi sia su "description" e il "translation.description" incorporato proprietà come definite qui. La "lingua di ricerca" appropriata viene sempre utilizzata come specificato con il $language opzione al $text operatore, poiché "stop words" e "stemming" sono ancora considerati in relazione a questo e alla lingua dell'indice predefinita impostata al momento della creazione dell'indice.

Il formato incorporato ti offre anche un punto facile da cui recuperare le informazioni sulla lingua per "tradurre" tra due lingue in cui hai il contenuto definito per entrambe le lingue in questione, quindi la sua praticità è "duplice" in questo caso.

La documentazione specifica si trova ora in Creare un indice di testo per una raccolta in più lingue come sezione all'interno dell'argomento più ampio Specificare una lingua per l'indice di testo che include collegamenti a tutti gli altri dettagli, inclusa la specifica di una lingua predefinita diversa nell'indice.