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

Crear un índice de texto comodín en MongoDB

MongoDB nos brinda la capacidad de crear índices de texto comodín.

Los índices de texto comodín son similares a los índices de texto comodín, excepto que los índices de texto comodín admiten el $text operador, mientras que los índices comodín no lo hacen.

Dicho esto, la creación de cada tipo de índice es muy similar en el sentido de que ambos comparten el comodín $** patrón de campo.

Ejemplo

Supongamos que tenemos una colección llamada posts y contiene documentos que se ven así:

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

Podríamos crear un índice de texto comodín en esa colección como este:

db.posts.createIndex( { "$**": "text" } )

Salida:

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

Eso usa el comodín $** patrón de campo para crear un índice en todos los campos de texto. Cuando crea un índice como este, MongoDB indexa cada campo que contiene datos de cadena para cada documento de la colección.

Hacer esto puede ser útil si la colección contiene mucho contenido no estructurado y no hay coherencia en los campos de texto de los documentos. En tales casos, no podría incluir explícitamente los campos en el índice porque no sabría qué campos estarán en los documentos.

Campos ponderados

Puedes usar los weights parámetro para asignar diferentes pesos a los campos en un índice de texto comodín.

Ejemplo:

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

Salida:

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

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() para devolver todos los índices de la colección, podemos ver las ponderaciones otorgadas 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 .