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 .