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

Crie um índice de texto com diferentes pesos de campo no MongoDB


Quando você cria um text index no MongoDB, você tem a opção de aplicar pesos diferentes a cada campo indexado.

Esses pesos denotam a significância relativa dos campos indexados entre si. Um campo com peso maior terá mais impacto nos resultados da pesquisa do que um campo com peso menor.

Isso fornece a você um certo controle sobre como os resultados da pesquisa são calculados.

O peso padrão é 1, portanto, se você não especificar um peso para o campo, será atribuído um peso de 1.

Exemplo


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..."
}

Poderíamos criar um text composto indexe aos três campos de texto e aplique pesos diferentes a cada um.

Assim:
db.posts.createIndex( 
  { 
    title : "text",
    body : "text",
    abstract : "text"
  },
  {
    weights: {
      body: 10,
      abstract: 5
    } 
  } 
)

Quando criei o composto 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() :
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.

Índices de texto curinga com campos ponderados


Você pode aplicar pesos ao criar índices de texto curinga. Índices de texto curinga podem ser úteis quando você não sabe quais serão os campos de texto nos documentos. Você pode conhecer algumas , mas nem todos.

Nesses casos, você pode criar um índice de texto curinga e atribuir um peso aos campos que você conhece. Quaisquer outros campos serão atribuídos ao valor padrão de 1.

Suponha que temos o seguinte documento como diretriz:
{
	"_id" : 1,
	"title" : "Title text...",
	"body" : "Body text...",
	"abstract" : "Abstract text...",
	"tags" : [
		"tag1",
		"tag2",
		"tag3"
	]
}

É semelhante ao documento anterior, exceto que agora tem um tags campo que contém uma matriz. Mas, pelo que sabemos, documentos futuros nessa coleção podem ter outros campos, como talvez categories , keywords , author_bio , etc

Mas na verdade não sabemos, então criaremos um índice de texto curinga que encapsulará todos os campos com dados de string. E vamos criar ponderações para alguns dos campos conhecidos.

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

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() , 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 .