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

Sådan opretter du et tekstindeks i MongoDB

Der er forskellige typer indekser, som du kan oprette i MongoDB. Hvis du har et felt, der indeholder en streng eller et array af strenge, kan du bruge en text indeks på det felt.

For at oprette en text indeks, brug strengen literal "text" som værdien, når den oprettes.

Opret et tekstindeks på et enkelt felt

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 ønsker måske at oprette en text indeks på body feltet eller abstract felt, eller endda begge dele.

Sådan opretter du en text indeks på body felt:

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

Output:

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

Vi kan nu bruge getIndexes() metode til at se indekset:

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, at der er to indekser. Den første er standard _id indeks, der oprettes automatisk med samlingen. Det andet indeks er det, vi lige har oprettet.

MongoDB har automatisk tildelt et navn til vores nyoprettede indeks. Det hedder body_text .

Opret et sammensat tekstindeks

En samling kan kun have én text indeks, men det kan være et sammensat indeks, hvis det kræves.

Lad os oprette et sammensat indeks, der inkluderer body feltet og abstract felt.

Som nævnt kan en samling kun have én text indeks, så lad os droppe det indeks, vi lige har oprettet:

db.posts.dropIndex("body_text")

Output:

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

OK, nu hvor vi har droppet text indeks, lad os gå videre og oprette endnu et - denne gang vil det være et sammensat indeks:

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

Output:

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

Det er en bekræftelsesmeddelelse, der fortæller os, at der plejede at være 1 indeks, men nu er der 2.

Lad os tjekke listen over indekser 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
	}
]

Bemærk den sammensatte text indekser har følgende begrænsninger:

  • En sammensat text indeks kan ikke indeholde andre specielle indekstyper, såsom multi-key eller geospatiale indeksfelter.
  • Hvis den sammensatte text indekset inkluderer nøgler foran text indeksnøgle for at udføre en $text søgning, skal forespørgselsprædikatet indeholde betingelser for lighedsmatch på de foregående nøgler.
  • Når du opretter en sammensat text indeks, al text indeksnøgler skal være opført ved siden af ​​i indeksspecifikationsdokumentet.

Opret et jokertegns-tekstindeks

Du kan oprette et jokertegn-tekstindeks ved at bruge jokertegnet $** feltmønster.

Lad os droppe det forrige indeks og oprette et jokertegns-indeks:

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

MongoDB giver os også mulighed for at oprette jokertegnindekser, men jokertegnstekstindekser og jokertegnindekser er to forskellige ting.

Især understøtter jokertegn tekstindekser $text operatør, hvorimod jokertegnsindekser ikke gør det.

weights Parameter

Når du opretter text indekser, har du mulighed for at angive en vægt på et eller flere felter. Som standard får hvert felt vægten 1. Men du kan ændre dette for at give felter mere eller mindre vægt i søgeresultaterne.

Eksempel

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

Jeg startede med at droppe det forrige indeks.

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

Oprettelse af tekstindekser på flere sprog

Du vil bemærke, at ovenstående text indekset inkluderer "default_language" : "english" og "language_override" : "language" i sin definition.

Disse felter hjælper med at håndtere dokumenter på flere sprog. Værdierne i ovenstående indeks er standardværdierne.

Når du opretter et dokument, kan du angive sproget for det dokument ved at bruge language felt (eller et andet felt defineret i language_override felt i text indeks). Hvis et sådant felt ikke findes i dokumentet, vil det bruge standardsproget angivet i default_language felt.

Du kan angive et default_language (og language_override ), når du opretter indekset.

Se Opret et flersproget tekstindeks i MongoDB for eksempler på oprettelse af tekstindekser, der understøtter flere sprog.


  1. Sådan sletter du MongoDB-dokumenter ved at importere en fil

  2. Sammensatte forespørgsler med Redis

  3. Implementering af goMongoDB-lignende Query-udtryksobjektevaluering

  4. Sådan løser du ClassNotFoundException:com.mongodb.connection.BufferProvider?