MongoDB ger oss möjligheten att skapa jokerteckentextindex.
Jokerteckentextindex liknar jokerteckenindex, förutom att jokerteckentextindex stöder $text
operatör, medan jokertecken inte gör det.
Som sagt, att skapa varje indextyp är väldigt lika i den meningen att de båda delar jokertecken $**
fältmönster.
Exempel
Anta att vi har en samling som heter posts
, och den innehåller dokument som ser ut så här:
{ "_id" : 1, "title" : "Title text...", "body" : "Body text...", "abstract" : "Abstract text...", "tags" : [ "tag1", "tag2", "tag3" ] }
Vi skulle kunna skapa ett jokertecken för den samlingen så här:
db.posts.createIndex( { "$**": "text" } )
Utdata:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Som använder jokertecken $**
fältmönster för att skapa ett index på alla textfält. När du skapar ett index som detta, indexerar MongoDB varje fält som innehåller strängdata för varje dokument i samlingen.
Att göra detta kan vara användbart om samlingen innehåller mycket ostrukturerat innehåll och det inte finns någon enhetlighet mellan textfälten i dokumenten. I sådana fall skulle du inte explicit kunna inkludera fälten i indexet eftersom du inte skulle veta vilka fält som kommer att finnas i dokumenten.
Viktade fält
Du kan använda weights
parameter för att tilldela olika vikter till fälten i ett jokerteckentextindex.
Exempel:
db.posts.createIndex(
{ "$**": "text" },
{ weights: {
body: 10,
abstract: 5
}
}
)
Utdata:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
I det här fallet, body
fältet får vikten 10
och abstract
fältet får vikten 5
. Det betyder att body
fältet har dubbelt så stor effekt som det abstrakta fältet och tio gånger så mycket som alla andra textfält (eftersom de kommer att tilldelas standardvikten 1).
Efter att ha skapat det indexet, om vi anropar getIndexes()
för att returnera alla index för samlingen kan vi se viktningen som ges till fälten:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Som förväntat, body
fältet får 10
, den abstract
fältet får 5
, och alla andra får 1
.