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 iltext
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, tuttotext
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.