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

Cómo crear un índice de texto en MongoDB

Hay varios tipos de índices que puede crear en MongoDB. Si tiene un campo que contiene una cadena o una matriz de cadenas, puede usar un text índice en ese campo.

Para crear un text índice, use el literal de cadena "text" como el valor al crearlo.

Crear un índice de texto en un solo campo

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 querer crear un text índice en el body campo, o el abstract campo, o incluso ambos.

Así es como se crea un text índice en el body campo:

db.posts.createIndex( { body : "text" } )

Salida:

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

Ahora podemos usar getIndexes() método para ver el í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 hay dos índices. El primero es el _id predeterminado. índice que se crea automáticamente con la colección. El segundo índice es el que acabamos de crear.

MongoDB ha asignado automáticamente un nombre a nuestro índice recién creado. Se llama body_text .

Crear un índice de texto compuesto

Una colección solo puede tener un text índice, pero puede ser un índice compuesto si es necesario.

Vamos a crear un índice compuesto que incluya el body campo y el abstract campo.

Como se mencionó, una colección solo puede tener un text index, así que eliminemos el índice que acabamos de crear:

db.posts.dropIndex("body_text")

Salida:

{ "nIndexesWas" : 2, "ok" : 1 }

Bien, ahora que hemos soltado el text index, sigamos adelante y creemos otro; esta vez será un índice compuesto:

db.posts.createIndex( { 
  body : "text",
  abstract : "text"
} )

Salida:

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

Ese es un mensaje de confirmación que nos dice que solía haber 1 índice pero ahora hay 2.

Revisemos la lista de índices nuevamente:

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
	}
]

Tenga en cuenta que el text compuesto los índices tienen las siguientes restricciones:

  • Un text compuesto El índice no puede incluir ningún otro tipo de índice especial, como campos de índice geoespacial o de clave múltiple.
  • Si el text compuesto el índice incluye claves que preceden al text clave de índice, para realizar un $text búsqueda, el predicado de consulta debe incluir condiciones de coincidencia de igualdad en las claves anteriores.
  • Al crear un text compuesto índice, todo text las claves de índice deben enumerarse de forma adyacente en el documento de especificación de índice.

Crear un índice de texto comodín

Puede crear un índice de texto comodín utilizando el comodín $** patrón de campo.

Descartemos el índice anterior y creemos un índice de texto comodín:

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

MongoDB también nos brinda la capacidad de crear índices comodín, sin embargo, los índices de texto comodín y los índices comodín son dos cosas distintas.

En particular, los índices de texto comodín admiten el $text operador, mientras que los índices comodín no lo hacen.

Los weights Parámetro

Al crear text índices, tiene la opción de especificar un peso en uno o más campos. De forma predeterminada, a cada campo se le da un peso de 1. Pero puede cambiar esto para darle a los campos más o menos peso en los resultados de búsqueda.

Ejemplo

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

Empecé descartando el índice anterior.

Cuando creé el nuevo text 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() de nuevo:

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.

Creación de índices de texto en varios idiomas

Notarás que el text anterior el índice incluye "default_language" : "english" y "language_override" : "language" en su definición.

Estos campos ayudan a manejar documentos en varios idiomas. Los valores en el índice anterior son los valores predeterminados.

Cuando crea un documento, puede especificar el idioma de ese documento usando el language (o algún otro campo definido en el language_override campo del text índice). Si dicho campo no existe en el documento, utilizará el idioma predeterminado especificado en el default_language campo.

Puede especificar un default_language (y language_override ) al crear el índice.

Consulte Crear un índice de texto en varios idiomas en MongoDB para ver ejemplos de creación de índices de texto compatibles con varios idiomas.