MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Criar um índice de texto multilíngue no MongoDB


Quando você cria um text index no MongoDB, o índice usa um idioma padrão de english .

O idioma padrão determina as regras para analisar as raízes das palavras (ou seja, lematização) e ignorar as palavras de parada.

No entanto, você pode alterar o idioma padrão, se necessário.

Você também pode especificar um idioma no nível do documento e até mesmo no nível do subdocumento. O idioma padrão só será usado se um idioma não tiver sido especificado no nível do documento ou subdocumento.

Este artigo apresenta exemplos de especificação de um idioma para um text índice.

Coleção de exemplo


Suponha que tenhamos uma coleção chamada sitcoms com documentos como este:
{
	"_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é"
		}
	]
}

Podemos ver que há dois documentos nesta coleção. Cada documento contém o nome de uma sitcom, juntamente com traduções desse nome de sitcom em diferentes idiomas. O idioma de cada tradução é especificado no language campo do respectivo subdocumento.

O segundo documento desta coleção também inclui um language campo em seu nível superior (neste caso, "language" : "spanish" ). Isso significa que o nome da sitcom está em espanhol (ou pelo menos, espanhol é o idioma que queremos que seja usado quando este documento for indexado).

No entanto, o primeiro documento não contém esse campo. O fato de o primeiro documento não conter um language de nível superior campo significa que queremos que ele seja indexado usando o idioma padrão. Se nenhum idioma padrão for especificado durante a indexação, o idioma padrão será o inglês.

Se um documento incorporado não contiver um campo que especifique o idioma, ele usará o campo de idioma do documento anexo. Se o documento anexo não contiver um campo de idioma, ele usará o idioma padrão.

Criar um índice de texto para vários idiomas


Vamos em frente e criar um text índice para a coleção acima.
db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  }
)

Isso cria um text composto indexe no original_name campo e o translations.sitcom_name campo (ou seja, o sitcom_name campo nos documentos incorporados).

Agora vamos usar getIndexes() para dar uma olhada nesse índice:
db.sitcoms.getIndexes()

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

Podemos ver que ele usa um idioma padrão de inglês. Isso é especificado como "default_language" : "english" .

Alterar o idioma padrão


Podemos definir um idioma padrão diferente ao criar o índice, se necessário.

Vamos descartar o índice e recriá-lo com um idioma padrão diferente:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish"
  }
)

Vejamos o índice:
db.sitcoms.getIndexes()

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

Podemos ver que o idioma padrão agora é danish como especificado.

O language_override Parâmetro


Você pode estar se perguntando “como o MongoDB sabia que o language do documento campo é o campo que especifica o idioma?”.

E essa é uma ótima pergunta. Afinal, e se tivéssemos dado ao campo um nome diferente - como o MongoDB saberia que ele é o campo a ser usado para o idioma?

Se você observar o índice acima, verá que ele tem um language_override campo. Especificamente, é assim:"language_override" : "language"

O que isso significa é que o language do documento field será o campo que o índice usa para substituir o idioma.

Quando você cria um text index, o índice procurará qualquer campo chamado language e, em seguida, use-os como o idioma do respectivo documento.

No entanto, o nome language não está gravado em pedra. Você pode alterá-lo se assim o desejar.

Suponha que nossa coleção contenha documentos em que os nomes dos campos estejam em dinamarquês.

Assim:
{
	"_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é"
		}
	]
}

Neste caso, sprog é o campo que determina o idioma de cada documento.

Portanto, podemos criar o índice da seguinte forma:
db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish",
    "language_override": "sprog"
  }
)

Vamos verificar o índice:
db.sitcoms.getIndexes()

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

Em nosso text recém-criado index, temos o default_language como danish , e o language_override campo como sprog .

Idiomas disponíveis


No momento da escrita, existem cerca de 15 idiomas que são suportados por text índices e o $text operador.

Você pode usar o nome de idioma longo (como nos exemplos acima) ou o código de idioma ISO 639-1 de duas letras.

Uma lista de idiomas de pesquisa de texto está disponível no site do MongoDB.