sql >> Databasteknik >  >> NoSQL >> MongoDB

Skapa ett textindex med olika fältvikter i MongoDB

När du skapar en text index i MongoDB, har du möjlighet att lägga olika vikter på varje indexerat fält.

Dessa vikter anger den relativa betydelsen av de indexerade fälten för varandra. Ett fält med högre vikt kommer att ha större inverkan i sökresultaten än ett fält med lägre vikt.

Detta ger dig en viss kontroll över hur sökresultaten beräknas.

Standardvikten är 1, så om du inte anger en vikt för fältet kommer det att tilldelas vikten 1.

Exempel

Anta att vi har en samling som heter posts , och den innehåller dokument som detta:

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

Vi skulle kunna skapa en sammansatt text indexera till de tre textfälten och tillämpa olika vikter på var och en.

Så här:

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

När jag skapade sammansättningen text index, jag angav 3 fält. När jag angav vikterna angav jag vikter för bara två av dessa fält.

Resultatet är att dessa två fält kommer att viktas som specificerat, och det andra fältet (title ) har standardvikten 1.

Vi kan se detta när vi kör 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 att body fältet kommer att ha dubbelt så stor betydelse som abstract fältet och tio gånger betydelsen av title fältet.

Jokerteckentextindex med viktade fält

Du kan använda vikter när du skapar textindex med jokertecken. Jokerteckentextindex kan vara praktiskt när du inte vet vilka textfält som kommer att vara i dokumenten. Du kanske känner några , men inte alla.

I sådana fall kan du skapa ett jokerteckentextindex och tilldela en vikt till de fält som du känner till. Alla andra fält kommer att tilldelas standardvärdet 1.

Anta att vi har följande dokument som riktlinje:

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

Det liknar det tidigare dokumentet, förutom att det nu har en tags fält som innehåller en array. Men för allt vi vet kan framtida dokument i den samlingen ha andra fält – som kanske categories , keywords , author_bio , etc.

Men vi vet faktiskt inte, så vi kommer att skapa ett jokerteckentextindex som kommer att kapsla in alla fält med strängdata. Och vi kommer att skapa viktningar för några av de kända fälten.

Exempel:

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

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() , 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. Hur kan jag säkert ansluta till Heroku-värd Redis från kommandoraden?

  2. Kan du ansluta till Amazon ElastiСache Redis utanför Amazon?

  3. Hitta nycklar som inte löper ut i Redis

  4. Användbara skript för Couchbase Dba