Det finns olika typer av index som du kan skapa i MongoDB. Om du har ett fält som innehåller en sträng eller en array av strängar kan du använda en text
index på det fältet.
För att skapa en text
index, använd strängen bokstavlig "text"
som värdet när du skapar det.
Skapa ett textindex på ett enda fält
Anta att vi har en samling som heter posts
, och den innehåller dokument som detta:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
Vi kanske vill skapa en text
index på body
fältet eller abstract
fältet, eller till och med båda.
Så här skapar du en text
index på body
fält:
db.posts.createIndex( { body : "text" } )
Utdata:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Vi kan nu använda getIndexes()
metod för att visa indexet:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Vi kan se att det finns två index. Den första är standard _id
index som skapas automatiskt med samlingen. Det andra indexet är det vi just skapade.
MongoDB har automatiskt tilldelat ett namn till vårt nyskapade index. Den heter body_text
.
Skapa ett sammansatt textindex
En samling kan bara ha en text
index, men det kan vara ett sammansatt index om det behövs.
Låt oss skapa ett sammansatt index som innehåller body
fältet och abstract
fältet.
Som nämnts kan en samling bara ha en text
index, så låt oss släppa indexet vi just skapade:
db.posts.dropIndex("body_text")
Utdata:
{ "nIndexesWas" : 2, "ok" : 1 }
OK, nu när vi har släppt text
index, låt oss gå vidare och skapa ett till – den här gången blir det ett sammansatt index:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Utdata:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Det är ett bekräftelsemeddelande som berättar att det brukade vara 1 index men nu finns det 2.
Låt oss kontrollera listan med index igen:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Observera att sammansatt text
index har följande begränsningar:
- En sammansatt
text
index kan inte inkludera några andra speciella indextyper, till exempel flernycklar eller geospatiala indexfält. - Om den sammansatta
text
index innehåller nycklar som föregårtext
indexnyckel, för att utföra en$text
sökning måste frågepredikatet inkludera likhetsmatchningsvillkor på de föregående nycklarna. - När du skapar en sammansatt
text
index, alltext
indexnycklar måste listas bredvid i indexspecifikationsdokumentet.
Skapa ett jokerteckentextindex
Du kan skapa ett jokerteckentextindex genom att använda jokertecknet $**
fältmönster.
Låt oss släppa det föregående indexet och skapa ett jokertecken:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB ger oss också möjligheten att skapa jokerteckenindex, men jokerteckentextindex och jokerteckenindex är två distinkta saker.
I synnerhet stöder jokerteckentextindex $text
operator, medan jokertecken inte gör det.
weights
Parameter
När du skapar text
index, har du möjlighet att ange en vikt på ett eller flera fält. Som standard ges varje fält vikten 1. Men du kan ändra detta för att ge fält mer eller mindre vikt i sökresultaten.
Exempel
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Jag började med att ta bort föregående index.
När jag skapade den nya text
index, jag angav 3 fält. När jag angav vikterna angav jag vikter för bara två av dessa fält.
Resultatet är att dessa två fält kommer att viktas som specificerat, och det andra fältet (title
) har standardvikten 1.
Vi kan se detta när vi kör getIndexes()
igen:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Det betyder att body
fältet kommer att ha dubbelt så stor betydelse som abstract
fältet och tio gånger betydelsen av title
fältet.
Skapa textindex på flera språk
Du kommer att märka att ovanstående text
index inkluderar "default_language" : "english"
och "language_override" : "language"
i sin definition.
Dessa fält hjälper dig att hantera dokument på flera språk. Värdena i ovanstående index är standardvärdena.
När du skapar ett dokument kan du ange språket för det dokumentet genom att använda language
fältet (eller något annat fält definierat i language_override
fältet i text
index). Om ett sådant fält inte finns i dokumentet kommer det att använda standardspråket som anges i default_language
fältet.
Du kan ange ett default_language
(och language_override
) när du skapar indexet.
Se Skapa ett flerspråkigt textindex i MongoDB för exempel på hur du skapar textindex som stöder flera språk.