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

Como criar um índice de texto no MongoDB


Existem vários tipos de índices que você pode criar no MongoDB. Se você tem um campo que contém uma string ou um array de strings, você pode usar um text índice nesse campo.

Para criar um text index, use a string literal "text" como o valor ao criá-lo.

Criar um índice de texto em um único campo


Suponha que tenhamos uma coleção chamada posts , e contém documentos como este:
{
	"_id" : 1,
	"title" : "The Web",
	"body" : "Body text...",
	"abstract" : "Abstract text..."
}

Podemos querer criar um text índice no body campo, ou o abstract campo, ou mesmo ambos.

Veja como criar um text índice no body campo:
db.posts.createIndex( { body : "text" } )

Saída:
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Agora podemos usar o getIndexes() método para visualizar o índice:
db.posts.getIndexes()

Resultado:
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "body_text",
		"weights" : {
			"body" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Podemos ver que existem dois índices. O primeiro é o padrão _id índice que é criado automaticamente com a coleção. O segundo índice é o que acabamos de criar.

O MongoDB atribuiu automaticamente um nome ao nosso índice recém-criado. Chama-se body_text .

Criar um índice de texto composto


Uma coleção pode ter apenas um text índice, mas pode ser um índice composto, se necessário.

Vamos criar um índice composto que inclui o body campo e o abstract campo.

Como mencionado, uma coleção pode ter apenas um text index, então vamos descartar o índice que acabamos de criar:
db.posts.dropIndex("body_text")

Saída:
{ "nIndexesWas" : 2, "ok" : 1 }

OK, agora que removemos o text index, vamos em frente e criar outro – desta vez será um índice composto:
db.posts.createIndex( { 
  body : "text",
  abstract : "text"
} )

Saída:
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Essa é uma mensagem de confirmação que nos diz que costumava haver 1 índice, mas agora existem 2.

Vamos verificar a lista de índices novamente:
db.posts.getIndexes()

Resultado:
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "body_text_abstract_text",
		"weights" : {
			"abstract" : 1,
			"body" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Observe que o composto text índices têm as seguintes restrições:
  • Um text composto index não pode incluir nenhum outro tipo de índice especial, como campos de índice multichave ou geoespacial.
  • Se o composto text índice inclui chaves que precedem o text chave de índice, para executar um $text search, o predicado de consulta deve incluir condições de correspondência de igualdade nas chaves anteriores.
  • Ao criar um text composto índice, todo text as chaves de índice devem ser listadas adjacentemente no documento de especificação de índice.

Criar um índice de texto curinga


Você pode criar um índice de texto curinga usando o curinga $** padrão de campo.

Vamos eliminar o índice anterior e criar um índice de texto curinga:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )

O MongoDB também nos fornece a capacidade de criar índices curinga, no entanto, índices de texto curinga e índices curinga são duas coisas distintas.

Em particular, os índices de texto curinga suportam o $text operador, enquanto os índices curinga não.

Os weights Parâmetro


Ao criar text índices, você tem a opção de especificar um peso em um ou mais campos. Por padrão, cada campo recebe um peso de 1. Mas você pode alterar isso para dar aos campos mais ou menos peso nos resultados da pesquisa.

Exemplo
db.posts.dropIndex("$**_text")
db.posts.createIndex( 
  { 
    title : "text",
    body : "text",
    abstract : "text"
  },
  {
    weights: {
      body: 10,
      abstract: 5
    } 
  } 
)

Comecei abandonando o índice anterior.

Quando criei o novo text index, especifiquei 3 campos. Quando especifiquei os pesos, especifiquei pesos para apenas dois desses campos.

O resultado é que esses dois campos serão ponderados conforme especificado, e o outro campo (title ) terá o peso padrão de 1.

Podemos ver isso quando executamos getIndexes() novamente:
db.posts.getIndexes()

Resultado:
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "title_text_body_text_abstract_text",
		"weights" : {
			"abstract" : 5,
			"body" : 10,
			"title" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Isso significa que o body campo terá o dobro do significado do abstract campo e dez vezes o significado do title campo.

Criando índices de texto em vários idiomas


Você notará que o text acima index inclui "default_language" : "english" e "language_override" : "language" em sua definição.

Esses campos ajudam a lidar com documentos em vários idiomas. Os valores no índice acima são os valores padrão.

Ao criar um documento, você pode especificar o idioma desse documento usando o language campo (ou algum outro campo definido no language_override campo do text índice). Se esse campo não existir no documento, ele usará o idioma padrão especificado no default_language campo.

Você pode especificar um default_language (e language_override ) ao criar o índice.

Consulte Criar um índice de texto multilíngue no MongoDB para obter exemplos de criação de índices de texto que dão suporte a vários idiomas.