MongoDB ci offre la possibilità di creare indici di testo con caratteri jolly.
Gli indici di testo con caratteri jolly sono simili agli indici di testo con caratteri jolly, tranne per il fatto che gli indici di testo con caratteri jolly supportano il $text
operatore, mentre gli indici con caratteri jolly no.
Detto questo, la creazione di ogni tipo di indice è molto simile, nel senso che entrambi condividono il carattere jolly $**
modello di campo.
Esempio
Supponiamo di avere una raccolta chiamata posts
e contiene documenti simili a questo:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Potremmo creare un indice di testo con caratteri jolly su quella raccolta in questo modo:
db.posts.createIndex( { "$**": "text" } )
Uscita:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Questo utilizza il carattere jolly $**
modello di campo per creare un indice su tutti i campi di testo. Quando crei un indice come questo, MongoDB indicizza ogni campo che contiene dati stringa per ogni documento nella raccolta.
Questa operazione può essere utile se la raccolta contiene molti contenuti non strutturati e non c'è coerenza di campi di testo nei documenti. In questi casi, non saresti in grado di includere esplicitamente i campi nell'indice perché non sapresti quali campi saranno nei documenti.
Campi ponderati
Puoi usare i weights
parametro per assegnare pesi diversi ai campi in un indice di testo jolly.
Esempio:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Uscita:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
In questo caso, il body
campo ottiene un peso di 10
e l'abstract
campo ottiene un peso di 5
. Ciò significa che il body
campo ha il doppio dell'impatto del campo astratto e dieci volte l'impatto di tutti gli altri campi di testo (perché verrà assegnato il peso predefinito di 1).
Dopo aver creato quell'indice, se chiamiamo getIndexes()
per restituire tutti gli indici per la raccolta, possiamo vedere le ponderazioni assegnate ai campi:
db.posts.getIndexes()
Risultato:
[ { "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 } ]
Come previsto, il body
il campo ottiene 10
, l'abstract
il campo ottiene 5
e tutti gli altri ottengono 1
.