Quando crei un text
index in MongoDB, hai la possibilità di applicare pesi diversi a ciascun campo indicizzato.
Questi pesi denotano il significato relativo dei campi indicizzati l'uno rispetto all'altro. Un campo con un peso maggiore avrà un impatto maggiore nei risultati di ricerca rispetto a un campo con un peso inferiore.
Ciò ti fornisce un certo controllo sul modo in cui vengono calcolati i risultati della ricerca.
Il peso predefinito è 1, quindi se non specifichi un peso per il campo, verrà assegnato un peso di 1.
Esempio
Supponiamo di avere una raccolta chiamata posts
e contiene documenti come questo:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Potremmo creare un text
composto indicizza i tre campi di testo e applica pesi diversi a ciascuno di essi.
In questo modo:
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Quando ho creato il composto 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()
:
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.
Indici di testo con caratteri jolly con campi ponderati
È possibile applicare pesi durante la creazione di indici di testo con caratteri jolly. Gli indici di testo con caratteri jolly possono essere utili quando non sai quali saranno i campi di testo nei documenti. Potresti conoscerne alcuni , ma non solo.
In questi casi, puoi creare un indice di testo con caratteri jolly e assegnare un peso a quei campi di cui sei a conoscenza. A tutti gli altri campi verrà assegnato il valore predefinito di 1.
Supponiamo di avere il seguente documento come linea guida:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
È simile al documento precedente, tranne per il fatto che ora ha un tags
campo che contiene una matrice. Ma per quanto ne sappiamo, i documenti futuri in quella raccolta potrebbero avere altri campi, come forse categories
, keywords
, author_bio
, ecc.
Ma in realtà non lo sappiamo, quindi creeremo un indice di testo con caratteri jolly che incapsula tutti i campi con dati di stringa. E creeremo ponderazioni per alcuni dei campi conosciuti.
Esempio:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
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()
, 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
.