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.