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

Opret et flersproget tekstindeks i MongoDB

Når du opretter en text indeks i MongoDB, bruger indekset et standardsprog english .

Standardsproget bestemmer reglerne for at analysere ordrødder (dvs. stemming) og ignorere stopord.

Du kan dog ændre standardsproget, hvis det er nødvendigt.

Du kan også angive et sprog på dokumentniveau og endda på underdokumentniveau. Standardsproget vil kun blive brugt, hvis der ikke er angivet et sprog på dokument- eller underdokumentniveau.

Denne artikel præsenterer eksempler på at angive et sprog for en text indeks.

Eksempelsamling

Antag, at vi har en samling kaldet sitcoms med dokumenter som dette:

{
	"_id" : 1,
	"original_name" : "Family Guy",
	"translations" : {
		"language" : "german",
		"sitcom_name" : "Familienmensch"
	}
}
{
	"_id" : 2,
	"original_name" : "Cuéntame como pasó",
	"language" : "spanish",
	"translations" : [
		{
			"language" : "english",
			"sitcom_name" : "Tell me how it happened"
		},
		{
			"language" : "french",
			"sitcom_name" : "Raconte-moi comment cela s'est passé"
		}
	]
}

Vi kan se, at der er to dokumenter i denne samling. Hvert dokument indeholder navnet på en sitcom sammen med oversættelser af sitcom-navnet på forskellige sprog. Sproget for hver oversættelse er angivet i language felt i det respektive underdokument.

Det andet dokument i denne samling indeholder også et language felt på dets øverste niveau (i dette tilfælde "language" : "spanish" ). Dette betyder, at sitcom-navnet er på spansk (eller i det mindste, spansk er det sprog, vi ønsker at blive brugt, når dette dokument er indekseret).

Det første dokument indeholder dog ikke et sådant felt. Det faktum, at det første dokument ikke indeholder et language på øverste niveau felt betyder, at vi ønsker, at det skal indekseres med standardsproget. Hvis der ikke er angivet noget standardsprog under indeksering, vil standardsproget være engelsk.

Hvis et indlejret dokument ikke indeholder et felt, der angiver sproget, vil det bruge sprogfeltet i det vedlagte dokument. Hvis det vedlagte dokument ikke indeholder et sprogfelt, vil det bruge standardsproget.

Opret et tekstindeks til flere sprog

Lad os gå videre og oprette en text indeks for ovenstående samling.

db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  }
)

Det skaber en sammensat text indeks på original_name feltet og translations.sitcom_name felt (dvs. sitcom_name felt i de indlejrede dokumenter).

Lad os nu bruge getIndexes() for at tage et kig på det indeks:

db.sitcoms.getIndexes()

Resultat:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "original_name_text_translations.sitcom_name_text",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"default_language" : "english",
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Vi kan se, at det bruger et standardsprog på engelsk. Dette er angivet som "default_language" : "english" .

Skift standardsproget

Vi kan indstille et andet standardsprog, når vi opretter indekset, hvis det kræves.

Lad os droppe indekset og genskabe det med et andet standardsprog:

db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish"
  }
)

Lad os tage et kig på indekset:

db.sitcoms.getIndexes()

Resultat:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "original_name_text_translations.sitcom_name_text",
		"default_language" : "danish",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"language_override" : "language",
		"textIndexVersion" : 3
	}
]

Vi kan se, at standardsproget nu er danish som specificeret.

language_override Parameter

Du undrer dig måske "hvordan vidste MongoDB, at dokumentets language felt er det felt, der angiver sproget?”.

Og det er et godt spørgsmål. Når alt kommer til alt, hvad nu hvis vi havde givet feltet et andet navn – hvordan ville MongoDB vide, at det skal feltet bruges til sproget?

Hvis du ser på ovenstående indeks, vil du se, at det har en language_override Mark. Konkret går det sådan her:"language_override" : "language"

Hvad det betyder er, at dokumentets language felt vil være det felt, som indekset bruger til at tilsidesætte sproget.

Når du opretter en text indeks, vil indekset lede efter felter kaldet language og brug derefter dem som sprog for det respektive dokument.

Dog navnet language er ikke hugget i sten. Du kan ændre det, hvis du ønsker det.

Antag, at vores samling indeholder dokumenter, hvor feltnavnene er på dansk.

Sådan:

{
	"_id" : 1,
	"originalt_navn" : "Family Guy",
	"sprog" : "english",
	"oversættelser" : {
		"sprog" : "german",
		"sitcom-navn" : "Familienmensch"
	}
}
{
	"_id" : 2,
	"originalt_navn" : "Cuéntame como pasó",
	"sprog" : "spanish",
	"oversættelser" : [
		{
			"sprog" : "english",
			"sitcom-navn" : "Tell me how it happened"
		},
		{
			"sprog" : "french",
			"sitcom-navn" : "Raconte-moi comment cela s'est passé"
		}
	]
}

I dette tilfælde language er det felt, der bestemmer sproget for hvert dokument.

Derfor kan vi oprette indekset som følger:

db.sitcoms.createIndex( 
  { 
    "original_name": "text",
    "translations.sitcom_name": "text"
  },
  {
    "default_language": "danish",
    "language_override": "sprog"
  }
)

Lad os tjekke indekset:

db.sitcoms.getIndexes()

Resultat:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"_fts" : "text",
			"_ftsx" : 1
		},
		"name" : "original_name_text_translations.sitcom_name_text",
		"default_language" : "danish",
		"language_override" : "sprog",
		"weights" : {
			"original_name" : 1,
			"translations.sitcom_name" : 1
		},
		"textIndexVersion" : 3
	}
]

I vores nyoprettede text indeks, har vi default_language som danish , og language_override felt som language .

Tilgængelige sprog

I skrivende stund er der omkring 15 sprog, der understøttes af text indekser og $text operatør.

Du kan bruge det lange sprognavn (som i ovenstående eksempler) eller den to bogstaver ISO 639-1 sprogkode.

En liste over tekstsøgningssprog er tilgængelig på MongoDB-webstedet.


  1. Undgå duplikatlogin med FOSUserBundle

  2. Rækkebaseret personsøgning mongodb

  3. Hvordan fortæller du Mongo om at sortere en samling, før du begrænser resultaterne?

  4. Find duplikerede webadresser i mongodb