首页 > 解决方案 > Mongodb 多语言搜索:哪种模式更适合更快的搜索结果 - 嵌套或直接具有特定于语言的字段

问题描述

我们正在使用 Atlas 搜索索引对产品进行模糊搜索,而对于查询,我们正在使用 Mongoose。我们想要的搜索类型包括多语言搜索,为此我们为产品使用以下模式 -

{
  language: "de",
  name: String,
  description: String,
  translation: {
     en: {
        name: String,
        description: String
     },
     fr: {
        name: String,
        description: String
     }
  }
}

考虑到搜索性能,上述模式是否非常合适,因为读取数据会有数千或更多的点击。展望未来,搜索查询可能会达到数百万,因为它是一个电子商务系统。具有嵌套结构将有利于查询,或者我们可以选择其他选项,

  1. 使用为语言指定的简写直接具有特定于语言的字段:
    {
         name_de: String,
         description_de: String,
         name_en: String,
         description_en: String,
         name_fr: String,
         description_fr: String
    }
  1. 具有以字段名称作为键嵌套的语言特定字段
    {
         name: {
            en: String,
            de: String,
            fr: String
         },
         description: {
            en: String,
            de: String,
            fr: String
         }
    }
  1. 将语言作为嵌套在该对象中的键和字段名称:

       {
          en: {
                name: String,
                description: String
              },
          fr: {
                name: String,
                description: String
              }
       }
    
  2. 或者任何其他适合这种情况的模式?

搜索将根据用户选择的语言进行。因此,如果用户选择法语作为他的首选语言,我们将查找用户以法语输入的关键字。

PS - 除了名称和描述之外,还有更多的字段,它们也是特定于语言的。

标签: mongodbmongoosemongoose-schemamongodb-atlasmongodb-atlas-search

解决方案


我会选择选项一,因为 Atlas Search 中对嵌套字段的支持有限,尽管选项 2 也可以。这是我在您的情况下定义索引的方式:

{
  "mappings": {
    "fields": {
      "name_de": {
        "analyzer": "lucene.german",
        "type": "string"
      },
      "name_fr": {
        "analyzer": "lucene.french",
        "type": "string"
      },
      "name_en": {
        "analyzer": "lucene.english",
        "type": "string"
      },
        "description_de": {
        "analyzer": "lucene.german",
        "type": "string"
      },
      "description_fr": {
        "analyzer": "lucene.french",
        "type": "string"
      },
      "description_en": {
        "analyzer": "lucene.english",
        "type": "string"
      }
    }
  }
}

这样,您可以获得突出显示的好处,如果您的描述字段很长,这可能会更加有用。您还将获得更好的停用词支持和开箱即用的变音符号。如果您有任何问题,请在这里告诉我,我会提供帮助。


推荐阅读