sql >> Base de Datos >  >> NoSQL >> MongoDB

Cree un índice de texto con diferentes pesos de campo en MongoDB

Cuando creas un text index en MongoDB, tiene la opción de aplicar diferentes pesos a cada campo indexado.

Estos pesos indican la importancia relativa de los campos indexados entre sí. Un campo con un peso más alto tendrá más impacto en los resultados de búsqueda que un campo con un peso más bajo.

Esto le proporciona una cierta cantidad de control sobre cómo se calculan los resultados de búsqueda.

La ponderación predeterminada es 1, por lo que si no especifica una ponderación para el campo, se le asignará una ponderación de 1.

Ejemplo

Supongamos que tenemos una colección llamada posts , y contiene documentos como este:

{
	"_id" : 1,
	"title" : "The Web",
	"body" : "Body text...",
	"abstract" : "Abstract text..."
}

Podríamos crear un text compuesto indexe los tres campos de texto y aplique pesos diferentes a cada uno.

Así:

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

Cuando creé el text compuesto index, especifiqué 3 campos. Cuando especifiqué los pesos, especifiqué pesos para solo dos de esos campos.

El resultado es que esos dos campos se ponderarán como se especifica, y el otro campo (title ) tendrá el peso predeterminado de 1.

Podemos ver esto cuando ejecutamos 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
	}
]

Esto significa que el body el campo tendrá el doble de significado que el abstract y diez veces la importancia del title campo.

Índices de texto comodín con campos ponderados

Puede aplicar ponderaciones al crear índices de texto comodín. Los índices de texto comodín pueden ser útiles cuando no sabe cuáles serán los campos de texto en los documentos. Es posible que conozcas algunos , pero no todos.

En tales casos, puede crear un índice de texto comodín y asignar un peso a los campos que conoce. A cualquier otro campo se le asignará el valor predeterminado de 1.

Supongamos que tenemos el siguiente documento como guía:

{
	"_id" : 1,
	"title" : "Title text...",
	"body" : "Body text...",
	"abstract" : "Abstract text...",
	"tags" : [
		"tag1",
		"tag2",
		"tag3"
	]
}

Es similar al documento anterior, excepto que ahora tiene tags campo que contiene una matriz. Pero, por lo que sabemos, los futuros documentos de esa colección podrían tener otros campos, como quizás categories. , keywords , author_bio , etc

Pero en realidad no lo sabemos, por lo que crearemos un índice de texto comodín que encapsulará todos los campos con datos de cadena. Y crearemos ponderaciones para algunos de los campos conocidos.

Ejemplo:

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

En este caso, el body el campo tiene un peso de 10 y el abstract el campo tiene un peso de 5 . Esto significa que el body El campo tiene el doble de impacto que el campo abstracto y diez veces el impacto de todos los demás campos de texto (porque se les asignará el peso predeterminado de 1).

Después de crear ese índice, si llamamos a getIndexes() , podemos ver las ponderaciones dadas a los 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 era de esperar, el body el campo obtiene 10 , el abstract el campo obtiene 5 , y todos los demás obtienen 1 .