多语言elasticsearch索引的最佳实践/经验

38

想知道在elasticsearch中进行多语言索引和搜索的最佳实践或经验是什么。我研究了许多资源,尽我所能概括一下,可用的索引选项有:

  1. 每种语言单独一个索引;

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

  3. 为所有可能的语言分别建立字段。

那么,想知道选择这些选项中的哪个会产生什么副作用(或者我错过了其他选项)。我猜更多的索引不会真正减慢集群(如果它不是一些巨大数量的语言),所以不确定选择 2 或 3 会带来什么好处,除了可能更容易维护。

欢迎任何帮助!


在我的使用场景中,只有一种语言是必需的,因此我使用了一个索引,为每种已知语言设置了分析器,将_analyzer放在语言路径上,并将相关语言内容保存在多个字段中:一次用于按语言进行分析,一次作为“无语言”的默认值。 - cfrick
4个回答

36
一个有点老的问题,但这些信息仍然可能有帮助。索引/映射结构主要取决于您的用例。您需要同时使用所有语言还是一次只使用一种语言?
选项1:例如多语言网站-用户只能看到和搜索当前选择的语言。在这种情况下,我的经验是每种语言一个索引会是个好的解决方案,特别是如果您需要轻松添加和删除语言。数据量可以分成不同的索引(性能上的好处)。为每种语言设置分析器很容易,特别是如果它们的设置仅因为语言名称而不同。就我个人而言,我目前正在为我的一个项目使用此选项。
选项2:如果您需要同时搜索所有语言,则多字段给您最方便的访问方式,因为您可以一次性访问所有子字段。

在这里,你可以按特定语言搜索(例如:“book_title.english”),也可以按所有语言搜索(使用“book_title”)。请务必注意,不要使用“book_title”名称更新该字段,而应使用“book_title.[语言]”。使用“book_title”将导致所有子字段都更新为相同的数据(这可能不是你想要的)。

  • 选项3:完全分开的字段-如果需要像选项2那样搜索,则需要将它们全部放入搜索查询中,从索引的角度来看更安全,因为您不能错误地覆盖所有语言

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


在看到这篇文章之前,我一直在考虑第四种类型。我的场景包含多个电子商店,每个商店都有一个或多个语言版本。唯一可搜索的文档类型是产品。我正在考虑以下索引/类型/文档结构:.../eshopName/language/product[]。你认为这是否可以成为处理仅具有产品搜索的多语言电子商店的标准方式?但是,我必须能够按语言或所有语言执行搜索,我应该能够通过 /eshop/en,de,fr/product 获得所有语言的搜索结果。 - ulkas
4
不应使用选项4,因为它会混乱索引频率,如此处所述:https://www.elastic.co/guide/en/elasticsearch/guide/current/one-lang-docs.html - Lumbendil
如何为这些字段设置值? - IamIC
1
仅仅是阅读对话时,当更新一个 Elasticsearch 文档时,内部将会删除旧文档并创建一个新文档。所以我认为选项2的警告是不正确的。 - Artholl

2

你的链接已过期。 - FAjir

0

我会选择选项1(每种语言一个单独的索引),正如Elasticsearch文档所建议的那样,因为它可以确保避免术语频率问题。

如果您的文档包含多种语言,您可以放置多个索引,并在查询时使用字段折叠来避免返回相同文档的重复。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接