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.