sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man skapar ett textindex i MongoDB

Det finns olika typer av index som du kan skapa i MongoDB. Om du har ett fält som innehåller en sträng eller en array av strängar kan du använda en text index på det fältet.

För att skapa en text index, använd strängen bokstavlig "text" som värdet när du skapar det.

Skapa ett textindex på ett enda fält

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 kanske vill skapa en text index på body fältet eller abstract fältet, eller till och med båda.

Så här skapar du en text index på body fält:

db.posts.createIndex( { body : "text" } )

Utdata:

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

Vi kan nu använda getIndexes() metod för att visa indexet:

db.posts.getIndexes()

Resultat:

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

Vi kan se att det finns två index. Den första är standard _id index som skapas automatiskt med samlingen. Det andra indexet är det vi just skapade.

MongoDB har automatiskt tilldelat ett namn till vårt nyskapade index. Den heter body_text .

Skapa ett sammansatt textindex

En samling kan bara ha en text index, men det kan vara ett sammansatt index om det behövs.

Låt oss skapa ett sammansatt index som innehåller body fältet och abstract fältet.

Som nämnts kan en samling bara ha en text index, så låt oss släppa indexet vi just skapade:

db.posts.dropIndex("body_text")

Utdata:

{ "nIndexesWas" : 2, "ok" : 1 }

OK, nu när vi har släppt text index, låt oss gå vidare och skapa ett till – den här gången blir det ett sammansatt index:

db.posts.createIndex( { 
  body : "text",
  abstract : "text"
} )

Utdata:

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

Det är ett bekräftelsemeddelande som berättar att det brukade vara 1 index men nu finns det 2.

Låt oss kontrollera listan med index igen:

db.posts.getIndexes()

Resultat:

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

Observera att sammansatt text index har följande begränsningar:

  • En sammansatt text index kan inte inkludera några andra speciella indextyper, till exempel flernycklar eller geospatiala indexfält.
  • Om den sammansatta text index innehåller nycklar som föregår text indexnyckel, för att utföra en $text sökning måste frågepredikatet inkludera likhetsmatchningsvillkor på de föregående nycklarna.
  • När du skapar en sammansatt text index, all text indexnycklar måste listas bredvid i indexspecifikationsdokumentet.

Skapa ett jokerteckentextindex

Du kan skapa ett jokerteckentextindex genom att använda jokertecknet $** fältmönster.

Låt oss släppa det föregående indexet och skapa ett jokertecken:

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

MongoDB ger oss också möjligheten att skapa jokerteckenindex, men jokerteckentextindex och jokerteckenindex är två distinkta saker.

I synnerhet stöder jokerteckentextindex $text operator, medan jokertecken inte gör det.

weights Parameter

När du skapar text index, har du möjlighet att ange en vikt på ett eller flera fält. Som standard ges varje fält vikten 1. Men du kan ändra detta för att ge fält mer eller mindre vikt i sökresultaten.

Exempel

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

Jag började med att ta bort föregående index.

När jag skapade den nya 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() igen:

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.

Skapa textindex på flera språk

Du kommer att märka att ovanstående text index inkluderar "default_language" : "english" och "language_override" : "language" i sin definition.

Dessa fält hjälper dig att hantera dokument på flera språk. Värdena i ovanstående index är standardvärdena.

När du skapar ett dokument kan du ange språket för det dokumentet genom att använda language fältet (eller något annat fält definierat i language_override fältet i text index). Om ett sådant fält inte finns i dokumentet kommer det att använda standardspråket som anges i default_language fältet.

Du kan ange ett default_language (och language_override ) när du skapar indexet.

Se Skapa ett flerspråkigt textindex i MongoDB för exempel på hur du skapar textindex som stöder flera språk.


  1. Vad är det korrekta sättet att indexera i MongoDB när stora kombinationer av fält finns

  2. NodeJS + MongoDB:Hämta data från insamling med findOne ()

  3. Enums i MongoDB

  4. Node.js - Mongoose - Kontrollera om det finns en samling