Er zijn verschillende soorten indexen die u in MongoDB kunt maken. Als u een veld heeft dat een tekenreeks of een reeks tekenreeksen bevat, kunt u een text
. gebruiken index op dat veld.
Een text
maken index, gebruik de letterlijke tekenreeks "text"
als de waarde bij het maken ervan.
Een tekstindex maken op een enkel veld
Stel dat we een verzameling hebben met de naam posts
, en het bevat documenten zoals deze:
{ "_id" : 1, "title" : "The Web", "body" : "Body text...", "abstract" : "Abstract text..." }
We willen misschien een text
. maken index op de body
veld, of het abstract
veld, of zelfs beide.
Zo maakt u een text
index op de body
veld:
db.posts.createIndex( { body : "text" } )
Uitgang:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
We kunnen nu de getIndexes()
. gebruiken methode om de index te bekijken:
db.posts.getIndexes()
Resultaat:
[ { "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 } ]
We kunnen zien dat er twee indexen zijn. De eerste is de standaard _id
index die automatisch wordt aangemaakt met de collectie. De tweede index is degene die we zojuist hebben gemaakt.
MongoDB heeft automatisch een naam toegewezen aan onze nieuw aangemaakte index. Het heet body_text
.
Een samengestelde tekstindex maken
Een verzameling kan slechts één text
. hebben index, maar het kan indien nodig een samengestelde index zijn.
Laten we een samengestelde index maken met de body
veld en het abstract
veld.
Zoals vermeld, kan een verzameling maar één text
. hebben index, dus laten we de index die we zojuist hebben gemaakt laten vallen:
db.posts.dropIndex("body_text")
Uitgang:
{ "nIndexesWas" : 2, "ok" : 1 }
OK, nu we de text
. hebben laten vallen index, laten we doorgaan en er nog een maken - dit keer wordt het een samengestelde index:
db.posts.createIndex( {
body : "text",
abstract : "text"
} )
Uitgang:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Dat is een bevestigingsbericht dat ons vertelt dat er vroeger 1 index was, maar nu zijn er 2.
Laten we de lijst met indexen nog eens bekijken:
db.posts.getIndexes()
Resultaat:
[ { "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 } ]
Merk op dat samengestelde text
indexen hebben de volgende beperkingen:
- Een samengestelde
text
index kan geen andere speciale indextypen bevatten, zoals velden met meerdere sleutels of geospatiale index. - Als de samengestelde
text
index bevat sleutels voorafgaand aan detext
indexsleutel, om een $text
. uit te voeren zoeken, moet het zoekwoordpredikaat gelijkheidsvoorwaarden bevatten voor de voorgaande sleutels. - Bij het maken van een samengestelde
text
index, alletext
indexsleutels moeten aangrenzend worden vermeld in het document met de indexspecificatie.
Een index met jokertekens maken
U kunt een wildcard-tekstindex maken met het jokerteken $**
veldpatroon.
Laten we de vorige index verwijderen en een wildcard-tekstindex maken:
db.posts.dropIndex("body_text_abstract_text")
db.posts.createIndex( { "$**" : "text" } )
MongoDB biedt ons ook de mogelijkheid om wildcard-indexen te maken, maar wildcard-tekstindexen en wildcard-indexen zijn twee verschillende dingen.
In het bijzonder ondersteunen wildcard-tekstindexen de $text
operator, terwijl wildcard-indexen dat niet doen.
De weights
Parameter
Bij het maken van text
indexen heeft u de mogelijkheid om een gewicht op te geven op één of meerdere velden. Standaard krijgt elk veld een gewicht van 1. Maar u kunt dit wijzigen om velden meer of minder gewicht te geven in de zoekresultaten.
Voorbeeld
db.posts.dropIndex("$**_text")
db.posts.createIndex(
{
title : "text",
body : "text",
abstract : "text"
},
{
weights: {
body: 10,
abstract: 5
}
}
)
Ik begon met het laten vallen van de vorige index.
Toen ik de nieuwe text
aanmaakte index, ik heb 3 velden opgegeven. Toen ik de gewichten specificeerde, specificeerde ik gewichten voor slechts twee van die velden.
Het resultaat is dat die twee velden worden gewogen zoals gespecificeerd, en het andere veld (title
) zal het standaardgewicht van 1 hebben.
We kunnen dit zien wanneer we getIndexes()
run uitvoeren nogmaals:
db.posts.getIndexes()
Resultaat:
[ { "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 } ]
Dit betekent dat de body
veld zal twee keer de betekenis hebben van de abstract
veld, en tien keer de betekenis van de title
veld.
Tekstindexen in meerdere talen maken
U zult merken dat de bovenstaande text
index bevat "default_language" : "english"
en "language_override" : "language"
in zijn definitie.
Deze velden helpen bij het omgaan met documenten in meerdere talen. De waarden in de bovenstaande index zijn de standaardwaarden.
Wanneer u een document aanmaakt, kunt u de taal van dat document specificeren met behulp van de language
veld (of een ander veld gedefinieerd in de language_override
veld van de text
inhoudsopgave). Als een dergelijk veld niet in het document bestaat, zal het de standaardtaal gebruiken die is gespecificeerd in de default_language
veld.
U kunt een default_language
. opgeven (en language_override
) wanneer u de index maakt.
Zie Een meertalige tekstindex maken in MongoDB voor voorbeelden van het maken van tekstindexen die meerdere talen ondersteunen.