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

Criar um índice de texto curinga no MongoDB


O MongoDB nos fornece a capacidade de criar índices de texto curinga.

Índices de texto curinga são semelhantes aos índices curinga, exceto que os índices de texto curinga suportam o $text operador, enquanto os índices curinga não.

Dito isso, a criação de cada tipo de índice é muito semelhante no sentido de que ambos compartilham o curinga $** padrão de campo.

Exemplo


Suponha que tenhamos uma coleção chamada posts , e contém documentos que se parecem com isso:
{
	"_id" : 1,
	"title" : "Title text...",
	"body" : "Body text...",
	"abstract" : "Abstract text...",
	"tags" : [
		"tag1",
		"tag2",
		"tag3"
	]
}

Poderíamos criar um índice de texto curinga nessa coleção assim:
db.posts.createIndex( { "$**": "text" } )

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

Que usa o caractere curinga $** padrão de campo para criar um índice em todos os campos de texto. Quando você cria um índice como este, o MongoDB indexa cada campo que contém dados de string para cada documento na coleção.

Fazer isso pode ser útil se a coleção contiver muito conteúdo não estruturado e não houver consistência de campos de texto nos documentos. Nesses casos, você não poderá incluir explicitamente os campos no índice porque não saberia quais campos estarão nos documentos.

Campos ponderados


Você pode usar os weights parâmetro para atribuir pesos diferentes aos campos em um índice de texto curinga.

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

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

Nesse caso, o body campo recebe um peso de 10 e o abstract campo recebe um peso de 5 . Isso significa que o body campo tem o dobro do impacto do campo de resumo e dez vezes o impacto de todos os outros campos de texto (porque eles receberão o peso padrão de 1).

Depois de criar esse índice, se chamarmos getIndexes() para retornar todos os índices da coleção, podemos ver os pesos dados aos campos:
db.posts.getIndexes()

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

Como esperado, o body campo obtém 10 , o abstract campo recebe 5 , e todos os outros recebem 1 .