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.