5

我有两个字段的集合

{
name : 'text English',
descr: 'Texto largo en español'
}

我想创建一个多语言搜索,对名称有更多偏好。到目前为止,我正在做这样的事情:

db.items.ensureIndex({
        name : "text",
        descr : "text"
    },{
        default_language: "spanish",
        name : "searchIndex",
        weights : {
            name : 3,
            descr: 1
        }
    }
)

问题是它将一切都视为西班牙语。查看文档我发现他们使用的是完全不同的模式。有什么想法可以实现我想要的吗?

4

2 回答 2

5

链接在问题和给出的原始答案中都已失效,但是有一种方法可以为此定义架构,现代版本支持该架构。

推荐的方法是"language"在用于文本索引的属性旁边的文档或嵌入文档中包含一个属性。术语“旁边”是指在“同一级别”,而不是与指数中的财产特别相邻。

一些常见的东西看起来像:

{
  "description": "Texto largo en español",
  "language": "spanish",
  "translation": [
    {
      "description": "Large text in Spanish",
      "language": "english"
    },
    {
      "description": "Grand texte en espagnol",
      "language": "french"
    }
  ]
},
{
  "description": "The quick brown fox",
  "translation": [
    {
      "description": "Le renard brun rapide",
      "language": : "french"
    }
  ]
}

然后假设我们使用“english”的“默认”文本索引语言,我们可以简单地使用以下索引:

db.collection.createIndex({ "description": "text", "translation.description": "text" })

然后,MongoDB 将使用"language"文档“根”或数组中“嵌入文档”中显示的属性,如果省略,它将仅使用为索引定义的默认值。例如,这里的第二个文档在“根”上没有语言属性,因此"english"假定它是索引上的默认值。

被索引的项目不需要按任何顺序排列,正如第一个示例文档在数组内具有嵌入文档的"english"条目所证明的那样。"translations"嵌入项目的规则略有不同,因为我们必须包含"language"嵌入文档的属性或与文档“根”一起使用的实际语言。在此示例中,数组中没有"language"属性的任何嵌入文档都将被视为正在使用"spanish",因为这是在“根”中定义的。

当然,搜索都是在考虑索引中存在的所有路径的情况下完成的,因此这里定义的"description"和嵌入的属性都是如此。"translation.description"适当的“搜索语言”仍然始终按照操作员的$language选项指定使用$text,因为“停用词”和“词干”仍然与此相关,并且在创建索引时设置默认索引语言。

嵌入式格式还为您提供了一个简单的点,您可以从中检索语言信息以在两种语言之间“翻译”,其中您为两种语言定义了内容,因此在这种情况下它的实用性是“双重”的。

特定文档现在位于为多种语言的集合创建文本索引,作为“为文本索引指定语言”更广泛主题中的一个部分,其中包括指向所有其他详细信息的链接,包括在索引上指定不同的默认语言。

于 2018-04-28T22:07:25.940 回答
3

您的具体意思是: http: //docs.mongodb.org/manual/tutorial/create-text-index-on-multi-language-collection/#use-any-field-to-specify-the-language-for-a -document我想,它允许您使用特定字段的值覆盖整个文档的语言。

你想从你的问题中得到什么,你还不能在 MongoDB 中做,但是这个功能计划用于即将发布的 MongoDB 版本。您可以在https://jira.mongodb.org/browse/SERVER-9390跟踪票证

于 2013-08-06T14:30:09.797 回答