mongodb - Mongodb 多语言搜索:哪种模式更适合更快的搜索结果 - 嵌套或直接具有特定于语言的字段
问题描述
我们正在使用 Atlas 搜索索引对产品进行模糊搜索,而对于查询,我们正在使用 Mongoose。我们想要的搜索类型包括多语言搜索,为此我们为产品使用以下模式 -
{
language: "de",
name: String,
description: String,
translation: {
en: {
name: String,
description: String
},
fr: {
name: String,
description: String
}
}
}
考虑到搜索性能,上述模式是否非常合适,因为读取数据会有数千或更多的点击。展望未来,搜索查询可能会达到数百万,因为它是一个电子商务系统。具有嵌套结构将有利于查询,或者我们可以选择其他选项,
- 使用为语言指定的简写直接具有特定于语言的字段:
{
name_de: String,
description_de: String,
name_en: String,
description_en: String,
name_fr: String,
description_fr: String
}
- 具有以字段名称作为键嵌套的语言特定字段
{
name: {
en: String,
de: String,
fr: String
},
description: {
en: String,
de: String,
fr: String
}
}
将语言作为嵌套在该对象中的键和字段名称:
{ en: { name: String, description: String }, fr: { name: String, description: String } }
或者任何其他适合这种情况的模式?
搜索将根据用户选择的语言进行。因此,如果用户选择法语作为他的首选语言,我们将查找用户以法语输入的关键字。
PS - 除了名称和描述之外,还有更多的字段,它们也是特定于语言的。
解决方案
我会选择选项一,因为 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"
}
}
}
}
这样,您可以获得突出显示的好处,如果您的描述字段很长,这可能会更加有用。您还将获得更好的停用词支持和开箱即用的变音符号。如果您有任何问题,请在这里告诉我,我会提供帮助。
推荐阅读
- json-deserialization - 使用 jackson 反序列化 json 文件:UnresolvedForwardReference
- elasticsearch - 日志发送的Logstash延迟
- list - Flutter 'map' 动态调用 null。接收方:'_Future 的实例
' 参数:['(dynamic) => Builder'的实例] - excel - 如何将循环的值添加到 Excel 中表格的新行?
- sql - Postgres | 如何从包含多个 JSON 对象的 JSON 数组中提取值
- vb.net - VB.NET中无法识别的数据库格式错误
- elasticsearch - .kibana 索引在 Kibana 中提供哪些信息?
- python - 在 Blender 中列出到记事本
- python - Flask 使用 asyncio 上传到 s3
- excel - 如何显示“并非所有项目都显示”VBA自动过滤器