sql >> Database >  >> NoSQL >> MongoDB

Een tekstindex maken in MongoDB

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 de text 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, alle text 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.


  1. Hoe redis-cluster te configureren bij gebruik van spring-data-redis 1.7.0.M1

  2. PostgreSQL en MongoDB mixen (als Django-backends)

  3. Suggesties voor een eenvoudige .NET gedistribueerde caching-oplossing

  4. Mongos installeren/instellen in elastische bonenstaak