sql >> Database >  >> NoSQL >> MongoDB

Maak een wildcard-tekstindex in MongoDB

MongoDB biedt ons de mogelijkheid om wildcard-tekstindexen te maken.

Wildcard-tekstindexen zijn vergelijkbaar met wildcard-indexen, behalve dat wildcard-tekstindexen de $text ondersteunen operator, terwijl wildcard-indexen dat niet doen.

Dat gezegd hebbende, lijkt het maken van elk indextype erg op elkaar in die zin dat ze allebei het jokerteken $** delen. veldpatroon.

Voorbeeld

Stel dat we een verzameling hebben met de naam posts , en het bevat documenten die er als volgt uitzien:

{
	"_id" : 1,
	"title" : "Title text...",
	"body" : "Body text...",
	"abstract" : "Abstract text...",
	"tags" : [
		"tag1",
		"tag2",
		"tag3"
	]
}

We kunnen een wildcard-tekstindex voor die verzameling als volgt maken:

db.posts.createIndex( { "$**": "text" } )

Uitgang:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

Dat gebruikt het jokerteken $** veldpatroon om een ​​index op alle tekstvelden te maken. Wanneer u een dergelijke index maakt, indexeert MongoDB elk veld dat tekenreeksgegevens bevat voor elk document in de verzameling.

Dit kan handig zijn als de collectie veel ongestructureerde inhoud bevat en de tekstvelden in de documenten niet consistent zijn. In dergelijke gevallen zou u de velden niet expliciet in de index kunnen opnemen omdat u niet zou weten welke velden in de documenten zullen staan.

Gewogen velden

U kunt de weights . gebruiken parameter om verschillende gewichten toe te kennen aan de velden in een wildcard-tekstindex.

Voorbeeld:

db.posts.createIndex( 
  { "$**": "text" },
  { weights: {
      body: 10,
      abstract: 5
    } 
  } 
)

Uitgang:

{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}

In dit geval is de body veld krijgt een gewicht van 10 en de abstract veld krijgt een gewicht van 5 . Dit betekent dat de body veld heeft twee keer de impact van het abstracte veld en tien keer de impact van alle andere tekstvelden (omdat ze het standaardgewicht van 1 krijgen).

Als we na het maken van die index getIndexes() . aanroepen om alle indexen voor de verzameling te retourneren, kunnen we de wegingen zien die aan de velden zijn gegeven:

db.posts.getIndexes()

Resultaat:

[
	{
		"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
	}
]

Zoals verwacht, de body veld krijgt 10 , de abstract veld krijgt 5 , en alle anderen krijgen 1 .


  1. MongoDB $binarySize

  2. Buitenlandse sleutels in Mongo?

  3. Vergelijk arrays en retourneer het verschil

  4. Wat is de juiste manier om een ​​synchrone MongoDB-query te maken in Node.js?