sql >> Database teknologi >  >> NoSQL >> MongoDB

Opret et tekstindeks med forskellige feltvægte i MongoDB

Når du opretter en text indeks i MongoDB, har du mulighed for at anvende forskellige vægte på hvert indekseret felt.

Disse vægte angiver den relative betydning af de indekserede felter i forhold til hinanden. Et felt med en højere vægt vil have mere indflydelse i søgeresultaterne end et felt med en lavere vægt.

Dette giver dig en vis kontrol over, hvordan søgeresultaterne beregnes.

Standardvægten er 1, så hvis du ikke angiver en vægt for felt, vil den blive tildelt en vægt på 1.

Eksempel

Antag, at vi har en samling kaldet posts , og det indeholder dokumenter som dette:

{
	"_id" : 1,
	"title" : "The Web",
	"body" : "Body text...",
	"abstract" : "Abstract text..."
}

Vi kunne lave en sammensat text indeksere til de tre tekstfelter og anvende forskellig vægt på hvert enkelt.

Sådan:

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

Da jeg oprettede den sammensatte text indeks, jeg specificerede 3 felter. Da jeg specificerede vægtene, angav jeg vægte for kun to af disse felter.

Resultatet er, at disse to felter vil blive vægtet som specificeret, og det andet felt (title ) vil have standardvægten 1.

Vi kan se dette, når vi kører getIndexes() :

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, at body feltet vil have dobbelt så stor betydning som abstract felt og ti gange betydningen af ​​title felt.

Jokertegn-tekstindekser med vægtede felter

Du kan anvende vægte, når du opretter jokertegn-tekstindekser. Wildcard-tekstindekser kan være praktiske, når du ikke ved, hvad tekstfelterne skal være i dokumenterne. Du kender måske nogle , men ikke alle.

I sådanne tilfælde kan du oprette et wildcard-tekstindeks og tildele en vægt til de felter, som du er opmærksom på. Alle andre felter vil blive tildelt standardværdien 1.

Antag, at vi har følgende dokument som rettesnor:

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

Det ligner det tidligere dokument, bortset fra at det nu har et tags felt, der indeholder en matrix. Men for alt, hvad vi ved, kan fremtidige dokumenter i den samling have andre felter – som måske categories , keywords , author_bio osv.

Men vi ved det faktisk ikke, så vi vil oprette et wildcard-tekstindeks, der vil indkapsle alle felter med strengdata. Og vi vil lave vægtninger for nogle af de kendte felter.

Eksempel:

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

I dette tilfælde er body felt får en vægt på 10 og den abstract felt får en vægt på 5 . Det betyder, at body felt har dobbelt så stor effekt som det abstrakte felt og ti gange så stor effekt som alle andre tekstfelter (fordi de vil blive tildelt standardvægten 1).

Efter at have oprettet det indeks, hvis vi kalder getIndexes() , kan vi se de vægtninger, der er givet til felterne:

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 forventet, body felt får 10 , den abstract felt får 5 , og alle andre får 1 .


  1. ved at bruge Async i en transaktion i Spring-applikationen

  2. Hvordan udfylder man indlejrede enheder i mongoose?

  3. MongoDB $allElementsTrue

  4. Reducer score i Redis eller fjern hvis 0