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

Crea un indice di testo multilingue in MongoDB

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.