在MongoDB中创建多语言文本索引
在 MongoDB 中创建文本索引时,该索引使用默认语言 .english
默认语言确定解析词根(即词干)和忽略停用词的规则。
但是,如果需要,您可以更改默认语言。
您还可以在文档级别甚至子文档级别指定语言。仅当未在文档或子文档级别指定语言时,才会使用默认语言。
本文提供了为索引指定语言的示例。text
示例集合
假设我们有一个集合,其中包含如下文档:sitcoms
{ “_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é” } ] }
我们可以看到此集合中有两个文档。每个文档都包含情景喜剧的名称,以及该情景喜剧名称的不同语言的翻译。每个翻译的语言在相应子文档的字段中指定。language
此集合中的第二个文档还包括其顶层的字段(在本例中为 )。这意味着情景喜剧名称是西班牙语(或者至少,西班牙语是我们在索引本文档时使用的语言)。language``"language" : "spanish"
但是,第一个文档不包含此类字段。第一个文档不包含顶级字段的事实意味着我们希望使用默认语言对其进行索引。如果在索引期间未指定默认语言,则默认语言将为英语。language
如果嵌入文档不包含指定语言的字段,则它将使用封闭文档的语言字段。如果封闭文档不包含语言字段,则将使用默认语言。
为多种语言创建文本索引
让我们继续为上述集合创建一个索引。text
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
}
)
这将在字段和字段(即嵌入文档中的字段)上创建复合索引。text``original_name``translations.sitcom_name``sitcom_name
现在让我们看一下该索引:[getIndexes()](https://database.guide/get-a-list-of-indexes-in-mongodb/ "Get a List of Indexes in MongoDB")
db.sitcoms.getIndexes()
输出:
[
{
"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
}
]我们可以看到它使用默认语言英语。这被指定为 。"default_language" : "english"
更改默认语言
如果需要,我们可以在创建索引时设置不同的默认语言。
让我们删除索引并使用不同的默认语言重新创建它:
db.sitcoms.dropIndex("original_name_text_translations.sitcom_name_text")
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish"
}
)
让我们看一下索引:
db.sitcoms.getIndexes()
输出:
[
{
"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
}
]我们可以看到默认语言现在是指定的。danish
参数language_override
您可能想知道“MongoDB如何知道文档的字段是指定语言的字段?language
这是一个很好的问题。毕竟,如果我们给字段一个不同的名称会怎样 - MongoDB怎么知道_它是_用于语言的字段?
如果你看上面的索引,你会发现它有一个字段。具体来说,它是这样的:language_override``"language_override" : "language"
这意味着文档的字段将是索引用于覆盖语言的字段。language
创建索引时,索引将查找调用的任何字段,然后使用这些字段作为相应文档的语言。text``language
然而,这个名字并不是一成不变的。如果您愿意,您可以更改它。language
假设我们的集合包含字段名称为丹麦语的文档。
示例如下:
{ “_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é” } ] }
在本例中, 是确定每个文档语言的字段。sprog
因此,我们可以按如下方式创建索引:
db.sitcoms.createIndex(
{
"original_name": "text",
"translations.sitcom_name": "text"
},
{
"default_language": "danish",
"language_override": "sprog"
}
)
让我们检查一下索引:
db.sitcoms.getIndexes()
输出:
[
{
"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
}
]在我们新创建的索引中,我们有 as 和字段 as 。text``default_language``danish``language_override``sprog
可用语言
在撰写本文时,索引和运算符支持大约 15 种语言。text``$text
您可以使用长格式语言名称(如上例所示)或两个字母的 ISO 639-1 语言代码。
文本搜索语言列表可在MongoDB网站上找到。