sql >> Databasteknik >  >> NoSQL >> MongoDB

Skapa ett flerspråkigt textindex i MongoDB

När du skapar en text index i MongoDB, indexet använder standardspråket english .

Standardspråket bestämmer reglerna för att analysera ordrötter (d.v.s. härstammning) och ignorera stoppord.

Du kan dock ändra standardspråket om det behövs.

Du kan också ange ett språk på dokumentnivå, och även på underdokumentnivå. Standardspråket kommer endast att användas om ett språk inte har specificerats på dokument- eller underdokumentnivå.

Den här artikeln presenterar exempel på hur du anger ett språk för en text index.

Exempelsamling

Anta att vi har en samling som heter sitcoms med dokument som detta:

{
	"_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 att det finns två dokument i denna samling. Varje dokument innehåller namnet på en sitcom, tillsammans med översättningar av det sitcom-namnet på olika språk. Språket för varje översättning anges i language fältet i respektive underdokument.

Det andra dokumentet i denna samling innehåller också ett language fältet på dess översta nivå (i detta fall "language" : "spanish" ). Det betyder att sitcomnamnet är på spanska (eller åtminstone spanska är det språk vi vill ska användas när detta dokument indexeras).

Det första dokumentet innehåller dock inte ett sådant fält. Det faktum att det första dokumentet inte innehåller ett language på toppnivå fält betyder att vi vill att det ska indexeras med standardspråket. Om inget standardspråk anges under indexeringen kommer standardspråket att vara engelska.

Om ett inbäddat dokument inte innehåller ett fält som anger språket kommer det att använda språkfältet för det bifogade dokumentet. Om det bifogade dokumentet inte innehåller ett språkfält kommer det att använda standardspråket.

Skapa ett textindex för flera språk

Låt oss gå vidare och skapa en text index för ovanstående samling.

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

Det skapar en sammansatt text index på original_name och translations.sitcom_name fältet (dvs. sitcom_name fältet i de inbäddade dokumenten).

Låt oss nu använda getIndexes() för att ta en titt på det indexet:

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 att den använder ett standardspråk engelska. Detta är specificerat som "default_language" : "english" .

Ändra standardspråk

Vi kan ställa in ett annat standardspråk när vi skapar indexet om det behövs.

Låt oss släppa indexet och återskapa det med ett annat standardspråk:

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

Låt oss ta en titt på indexet:

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 att standardspråket nu är danish som specificerats.

language_override Parameter

Du kanske undrar "hur visste MongoDB att dokumentets language fältet är fältet som anger språket?”.

Och det är en jättebra fråga. När allt kommer omkring, tänk om vi hade gett fältet ett annat namn – hur skulle MongoDB veta att det ska fältet användas för språket?

Om du tittar på indexet ovan ser du att det har en language_override fält. Specifikt ser det ut så här:"language_override" : "language"

Vad det betyder är att dokumentets language fältet kommer att vara det fält som indexet använder för att åsidosätta språket.

När du skapar en text index, kommer indexet att leta efter alla fält som heter language och använd sedan dessa som språk för respektive dokument.

Däremot namnet language är inte hugget i sten. Du kan ändra det om du vill.

Anta att vår samling innehåller dokument där fältnamnen är på danska.

Så här:

{
	"_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 det här fallet, sprog är fältet som bestämmer språket för varje dokument.

Därför kan vi skapa indexet enligt följande:

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

Låt oss kolla indexet:

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 vår nyskapade text index, har vi default_language som danish och language_override fältet som sprog .

Tillgängliga språk

I skrivande stund finns det cirka 15 språk som stöds av text index och $text operatör.

Du kan använda det långa språknamnet (som i exemplen ovan) eller ISO 639-1-språkkoden med två bokstäver.

En lista över textsökningsspråk finns på MongoDB-webbplatsen.


  1. Finns det något rekommenderat värde på COUNT för SCAN / HSCAN-kommandot i REDIS?

  2. använd node-redis med nod 8 util.promisify

  3. Hur man använder $cond operation i Spring-MongoDb aggregeringsramverk

  4. Använd en JsonConverter globalt på en klass utan attributet