MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come creare un indice di testo in MongoDB

Esistono vari tipi di indici che puoi creare in MongoDB. Se hai un campo che contiene una stringa o un array di stringhe, puoi usare un text indice su quel campo.

Per creare un text index, usa la stringa letterale "text" come valore durante la creazione.

Crea un indice di testo su un singolo campo

Supponiamo di avere una raccolta chiamata posts e contiene documenti come questo:

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

Potremmo voler creare un text indice sul body o il abstract campo, o anche entrambi.

Ecco come creare un text indice sul body campo:

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

Uscita:

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

Ora possiamo usare getIndexes() metodo per visualizzare l'indice:

db.posts.getIndexes()

Risultato:

[
	{
		"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
	}
]

Possiamo vedere che ci sono due indici. Il primo è il _id predefinito indice che viene creato automaticamente con la raccolta. Il secondo indice è quello che abbiamo appena creato.

MongoDB ha assegnato automaticamente un nome al nostro indice appena creato. Si chiama body_text .

Crea un indice di testo composto

Una raccolta può avere un solo text index, ma può essere un indice composto, se necessario.

Creiamo un indice composto che includa il body campo e l'abstract campo.

Come accennato, una raccolta può avere un solo text index, quindi lasciamo cadere l'indice che abbiamo appena creato:

db.posts.dropIndex("body_text")

Uscita:

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

OK, ora che abbiamo eliminato il text index, andiamo avanti e creiamone un altro – questa volta sarà un indice composto:

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

Uscita:

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

Questo è un messaggio di conferma che ci dice che prima c'era 1 indice ma ora ce ne sono 2.

Controlliamo di nuovo l'elenco degli indici:

db.posts.getIndexes()

Risultato:

[
	{
		"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
	}
]

Nota che il composto text gli indici hanno le seguenti restrizioni:

  • Un text composto index non può includere altri tipi di indice speciali, ad esempio campi di indice multichiave o geospaziale.
  • Se il composto text index include le chiavi che precedono il text chiave indice, per eseguire un $text ricerca, il predicato della query deve includere condizioni di corrispondenza di uguaglianza sulle chiavi precedenti.
  • Quando si crea un text composto indice, tutto text le chiavi di indice devono essere elencate accanto nel documento di specifica dell'indice.

Crea un indice di testo con caratteri jolly

Puoi creare un indice di testo con caratteri jolly utilizzando il carattere jolly $** modello di campo.

Rilasciamo l'indice precedente e creiamo un indice di testo con caratteri jolly:

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

MongoDB ci offre anche la possibilità di creare indici con caratteri jolly, tuttavia gli indici di testo con caratteri jolly e gli indici con caratteri jolly sono due cose distinte.

In particolare, gli indici di testo con caratteri jolly supportano il $text operatore, mentre gli indici con caratteri jolly no.

I weights Parametro

Durante la creazione di text indici, hai la possibilità di specificare un peso su uno o più campi. Per impostazione predefinita, a ciascun campo viene assegnato un peso di 1. Ma puoi modificarlo per assegnare ai campi un peso maggiore o minore nei risultati della ricerca.

Esempio

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

Ho iniziato eliminando l'indice precedente.

Quando ho creato il nuovo text indice, ho specificato 3 campi. Quando ho specificato i pesi, ho specificato i pesi solo per due di quei campi.

Il risultato è che questi due campi verranno ponderati come specificato e l'altro campo (title ) avrà il peso predefinito di 1.

Possiamo vederlo quando eseguiamo getIndexes() ancora:

db.posts.getIndexes()

Risultato:

[
	{
		"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
	}
]

Ciò significa che il body il campo avrà il doppio del significato dell'abstract campo e dieci volte il significato del title campo.

Creazione di indici di testo in più lingue

Noterai che il text sopra index include "default_language" : "english" e "language_override" : "language" nella sua definizione.

Questi campi aiutano nella gestione di documenti in più lingue. I valori nell'indice sopra sono i valori predefiniti.

Quando crei un documento, puoi specificare la lingua di quel documento utilizzando la language campo (o qualche altro campo definito in language_override campo del text indice). Se tale campo non esiste nel documento, utilizzerà la lingua predefinita specificata in default_language campo.

Puoi specificare un default_language (e language_override ) quando crei l'indice.

Consulta Creare un indice di testo multilingue in MongoDB per esempi di creazione di indici di testo che supportano più lingue.