sql >> Databasteknik >  >> NoSQL >> MongoDB

Skapa ett jokerteckentextindex i MongoDB

MongoDB ger oss möjligheten att skapa jokerteckentextindex.

Jokerteckentextindex liknar jokerteckenindex, förutom att jokerteckentextindex stöder $text operatör, medan jokertecken inte gör det.

Som sagt, att skapa varje indextyp är väldigt lika i den meningen att de båda delar jokertecken $** fältmönster.

Exempel

Anta att vi har en samling som heter posts , och den innehåller dokument som ser ut så här:

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

Vi skulle kunna skapa ett jokertecken för den samlingen så här:

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

Utdata:

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

Som använder jokertecken $** fältmönster för att skapa ett index på alla textfält. När du skapar ett index som detta, indexerar MongoDB varje fält som innehåller strängdata för varje dokument i samlingen.

Att göra detta kan vara användbart om samlingen innehåller mycket ostrukturerat innehåll och det inte finns någon enhetlighet mellan textfälten i dokumenten. I sådana fall skulle du inte explicit kunna inkludera fälten i indexet eftersom du inte skulle veta vilka fält som kommer att finnas i dokumenten.

Viktade fält

Du kan använda weights parameter för att tilldela olika vikter till fälten i ett jokerteckentextindex.

Exempel:

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

Utdata:

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

I det här fallet, body fältet får vikten 10 och abstract fältet får vikten 5 . Det betyder att body fältet har dubbelt så stor effekt som det abstrakta fältet och tio gånger så mycket som alla andra textfält (eftersom de kommer att tilldelas standardvikten 1).

Efter att ha skapat det indexet, om vi anropar getIndexes() för att returnera alla index för samlingen kan vi se viktningen som ges till fälten:

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 förväntat, body fältet får 10 , den abstract fältet får 5 , och alla andra får 1 .


  1. Stöder Mongoose Mongodb `findAndModify`-metoden?

  2. Att använda multiprocessing pool från selleri uppgift väcker undantag

  3. Hur man skapar skiftlägesokänsliga index i MongoDB

  4. Ansluter du direkt till Redis med (klientsidan) javascript?