多语言弹性搜索索引最佳实践/经验

时间:2014-03-03 17:43:57

标签: elasticsearch multilingual full-text-indexing

想知道在弹性搜索中使用多语言索引和搜索的最佳实践或体验是什么。我读了很多资源,尽可能提炼索引的可用选项是:

  1. 每种语言单独索引;

  2. 多语言字段的多字段类型;

  3. 所有可能语言的单独字段。

  4. 所以,想知道选择这些选项中的一个或另一个(或者其他一些我错过的)的副作用。我想有更多的索引并没有真正减慢群集的速度(如果它不是一些大量的语言),所以不确定从选择2或3可以得到什么,除了可能更容易维护。

    欢迎任何帮助!

4 个答案:

答案 0 :(得分:19)

有点老问题,但无论如何,信息可能会有所帮助。 索引/映射结构主要取决于您的用例 您是否需要同时使用所有语言,或者只使用一种语言?

  • 选项1 : 例如,多语言网站 - 用户只能以他们选择的当前语言查看和搜索。在这种情况下,我的经验是index-per-lang是一个很好的解决方案,特别是如果你需要能够轻松添加和删除语言。数据量在指数之间分开(性能效益)。轻松设置每种语言的分析仪,特别是如果它们的设置仅因语言名称而异。我个人目前正在为我的一个项目使用此选项

选项2和3的常规说明 :使用其中一个选项,您可以根据语言对文档进行不同的评分,因为您可以定义评分每个语言领域。如果需要添加更多语言,可以向映射添加新字段,但无法删除或更改现有字段。因此,您必须重新索引所有内容,并将已删除语言的属性设置为空。您需要为每种新语言添加新的分析器。但是需要先关闭索引并在更改后打开它。

  • 选项2 :如果您需要一次搜索所有语言,多字段可让您获得最简单的访问权限,因为您可以一次性处理所有子字段:

    "book_title": {
        "type": "multi_field",
        "fields": {
            "english": {
                "type": "string"
            },
            "german": {
                "type": "string"
            },
            "italian": {
                "type": "string"
            },
        }
    }

在这里,您可以使用特定语言(例如:" book_title.english ")或所有语言进行搜索(使用" book_title &#34)。您应该小心使用" book_title "更新字段名称,但使用" book_title。[语言] "。使用" book_title "将导致更新所有具有相同数据的子字段(可能不是您想要的)

  • 选项3 :完全独立的字段 - 如果您需要按照选项2进行搜索,则需要将它们全部放在搜索查询中,在索引方面更安全,因为您不能错误地覆盖所有语言

  • 选项4的想法 - 使用每种语言类型:如果您只有一种类型的文档,则可以使用它。每种语言可以有不同的字段。如果您有多种文档类型

  • ,则无用

答案 1 :(得分:1)

如果其他人正在寻找答案,可以直接链接到ElasticSearch网站上的文档:https://www.elastic.co/guide/en/elasticsearch/guide/current/mixed-lang-fields.html

答案 2 :(得分:0)

我会按照建议by the Elasticsearch documentation使用选项1 (每种语言使用单独的索引),因为它可以确保避免词频出现问题。

如果您的文档包含多种语言,则可以放入多个索引并使用field collapsing查询时间来避免返回同一文档的重复项。

答案 3 :(得分:0)

我认为这完全取决于用例。我认为,如果我们有多个具有混合语言(区域设置)的字段,那么选项1将不是最佳选择,因为对于不可本地化的字段,将会有很多冗余数据。在这种情况下,选项2可能更好。