elasticsearch,Mongodb,elasticsearch" /> elasticsearch,Mongodb,elasticsearch" />

Mongodb 使用多种语言的文档定义ElasticSearch索引

Mongodb 使用多种语言的文档定义ElasticSearch索引,mongodb,elasticsearch,Mongodb,elasticsearch,我正在尝试迁移MongoDB数据库,它必须使用ElasticSearch。MongoDB支持这一点,它有一个额外的字段,告诉子文档使用的是哪种语言。例如: { _id: 1, language: "portuguese", original: "A sorte protege os audazes.", translation: [ { language: "english&

我正在尝试迁移MongoDB数据库,它必须使用ElasticSearch。MongoDB支持这一点,它有一个额外的字段,告诉子文档使用的是哪种语言。例如:

{
   _id: 1,
   language: "portuguese",
   original: "A sorte protege os audazes.",
   translation:
     [
        {
           language: "english",
           quote: "Fortune favors the bold."
        },
        {
           language: "spanish",
           quote: "La suerte protege a los audaces."
        }
    ]
}

在ElasticSearch中,我找不到支持这一点的方法。似乎我只能为每个字段指定语言,但该语言不能基于另一个字段。还是我错了?有没有办法支持这一点?如果不是,对于上面的示例,最适合ElasticSearch的文档模式是什么?

同样的模式在ElasticSearch中可用,称为。因此,对于您的示例,您需要将索引映射定义为

{
    "mappings": {
        "properties": {
            "text": {
                "type": "text",
                "fields": {
                    "english": {
                        "type": "text",
                        "analyzer": "english"
                    },
                    "spanish": { --> this sub-field will have Spanish content, which spanish inbuilt analyzer
                        "type": "text",
                        "analyzer": "spanish"
                    }
                }
            }
        }
    }
}
你可以在elasticsearch中找到

您可以查询多个特定于语言的字段

{
  "query": {
    "multi_match": {
      "query": "quick brown foxes",
      "fields": [ 
        "text",
        "text.english" --> query english sub-field
        "text.spanish" --> query spanish sub-field
      ],
      "type": "most_fields" 
    }
  }
}

嗯,我看不出这是如何回答我的数据结构如前所述的问题的。所以问题是,
翻译
是一个对象数组,每个对象都有自己的语言,因此需要不同的分析器。您的答案根本没有触及这一点。@Mitar感谢您的更新,如果您仔细注意,
text
有两个子字段(英语和西班牙语,它们使用自己的分析器),您可以添加多达个语言字段,以及它们的语言分析器(由elasticsearch支持,我也提供了链接)@Mitar,如果您还有疑问,请阅读我的链接中提到的官方文件,这将使其更加清晰,并随时询问后续问题是的,我已经阅读了。当原始文档看起来像
{“text”:“content”}
并且
的“content”
可能使用不同的语言时,您的解决方案会起作用。这不是我的结构。我有一个包含子文档的数组,其中每个子文档都有确切的已知语言,存储在一个字段中。@Mitar,是的,我明白了,这只是结构上的差异,你可以让它与你的数据类型一起工作(概念很重要),你可以根据需要对数据建模。希望你明白这一点