Quando crei un text
index in MongoDB, l'indice utilizza una lingua predefinita di english
.
La lingua predefinita determina le regole per analizzare le radici delle parole (es. stemming) e ignorare le parole non significative.
Tuttavia, puoi modificare la lingua predefinita, se necessario.
È inoltre possibile specificare una lingua a livello di documento e persino a livello di documento secondario. La lingua predefinita verrà utilizzata solo se non è stata specificata una lingua a livello di documento o documento secondario.
Questo articolo presenta esempi di specifica di una lingua per un text
indice.
Raccolta di esempi
Supponiamo di avere una collezione chiamata sitcoms
con documenti come questo:
{ "_id" : 1, "original_name" : "Family Guy", "translations" : { "language" : "german", "sitcom_name" : "Familienmensch" } } { "_id" : 2, "original_name" : "Cuéntame como pasó", "language" : "spanish", "translations" : [ { "language" : "english", "sitcom_name" : "Tell me how it happened" }, { "language" : "french", "sitcom_name" : "Raconte-moi comment cela s'est passé" } ] }
Possiamo vedere che ci sono due documenti in questa raccolta. Ogni documento contiene il nome di una sitcom, insieme alle traduzioni del nome della sitcom in diverse lingue. La lingua di ciascuna traduzione è specificata nella language
campo del rispettivo documento secondario.
Il secondo documento di questa raccolta include anche una language
campo al suo livello superiore (in questo caso, "language" : "spanish"
). Ciò significa che il nome della sitcom è in spagnolo (o almeno, lo spagnolo è la lingua che vogliamo utilizzare quando questo documento viene indicizzato).
Tuttavia, il primo documento non contiene tale campo. Il fatto che il primo documento non contenga una language
di primo livello campo significa che vogliamo che sia indicizzato usando la lingua predefinita. Se durante l'indicizzazione non viene specificata alcuna lingua predefinita, la lingua predefinita sarà l'inglese.
Se un documento incorporato non contiene un campo che specifica la lingua, utilizzerà il campo della lingua del documento che lo contiene. Se il documento allegato non contiene un campo lingua, utilizzerà la lingua predefinita.
Crea un indice di testo per più lingue
Andiamo avanti e creiamo un text
indice per la raccolta di cui sopra.
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
}
)
Questo crea un text
composto indice sul original_name
campo e il translations.sitcom_name
campo (ovvero il sitcom_name
campo nei documenti incorporati).
Ora usiamo getIndexes()
per dare un'occhiata a quell'indice:
db.sitcoms.getIndexes()
Risultato:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Possiamo vedere che utilizza una lingua predefinita di inglese. Questo è specificato come "default_language" : "english"
.
Cambia la lingua predefinita
Se necessario, possiamo impostare una lingua predefinita diversa durante la creazione dell'indice.
Rilasciamo l'indice e lo ricreiamo con una lingua predefinita diversa:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish"
}
)
Diamo un'occhiata all'indice:
db.sitcoms.getIndexes()
Risultato:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "default_language" : "danish", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "language_override" : "language", "textIndexVersion" : 3 } ]
Possiamo vedere che la lingua predefinita ora è danish
come specificato.
Il language_override
Parametro
Ti starai chiedendo "come faceva MongoDB a sapere che il language
del documento field è il campo che specifica la lingua?”.
E questa è un'ottima domanda. Dopotutto, cosa accadrebbe se avessimo assegnato al campo un nome diverso:come farebbe MongoDB a sapere che esso è il campo da utilizzare per la lingua?
Se guardi l'indice sopra, vedrai che ha un language_override
campo. Nello specifico, funziona così:"language_override" : "language"
Ciò significa che la language
del documento campo sarà il campo utilizzato dall'indice per sovrascrivere la lingua.
Quando crei un text
index, l'indice cercherà tutti i campi chiamati language
e quindi usa quelli come lingua per il rispettivo documento.
Tuttavia, il nome language
non è scolpito nella pietra. Puoi cambiarlo se lo desideri.
Supponiamo che la nostra raccolta contenga documenti in cui i nomi dei campi sono in danese.
In questo modo:
{ "_id" : 1, "originalt_navn" : "Family Guy", "sprog" : "english", "oversættelser" : { "sprog" : "german", "sitcom-navn" : "Familienmensch" } } { "_id" : 2, "originalt_navn" : "Cuéntame como pasó", "sprog" : "spanish", "oversættelser" : [ { "sprog" : "english", "sitcom-navn" : "Tell me how it happened" }, { "sprog" : "french", "sitcom-navn" : "Raconte-moi comment cela s'est passé" } ] }
In questo caso, sprog
è il campo che determina la lingua di ogni documento.
Pertanto, possiamo creare l'indice come segue:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog"
}
)
Controlliamo l'indice:
db.sitcoms.getIndexes()
Risultato:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "original_name_text_translations.sitcom_name_text", "default_language" : "danish", "language_override" : "sprog", "weights" : { "original_name" : 1, "translations.sitcom_name" : 1 }, "textIndexVersion" : 3 } ]
Nel nostro text
appena creato index, abbiamo il default_language
come danish
e il language_override
campo come sprog
.
Lingue disponibili
Al momento della scrittura, ci sono circa 15 lingue supportate da text
indici e il $text
operatore.
Puoi utilizzare il nome della lingua in formato lungo (come negli esempi precedenti) o il codice della lingua ISO 639-1 a due lettere.
Un elenco di lingue di ricerca del testo è disponibile sul sito Web di MongoDB.