【问题标题】:ElasticSearch: Performance Implications of Multiple Types in the same IndexElasticSearch:同一索引中多种类型的性能影响
【发布时间】:2013-12-12 03:52:46
【问题描述】:

我们将少量多态文档子类型存储在单个索引中(例如,假设我们存储具有汽车、货车、摩托车和蝙蝠车子类型的车辆)。

目前,这些子类型(例如制造商、车轮数量、令人敬畏的交通方式排名)的领域有 >80% 的共性。

标准情况是搜索所有类型,但有时用户希望将结果过滤到子类型的子集:只查找具有...的汽车。

将这些子类型建模为不同的 ElasticSearch 类型与使用某些特定于应用程序的字段将它们建模为单一类型以区分子类型,在搜索/索引时会产生多少开销(如果有)?

我已经浏览了几个相关的答案,但找不到我的确切问题的答案。

非常感谢!

【问题讨论】:

  • 根据我之前使用 Lucene/SOLR 的经验,我假设这两种方法在 Lucene 索引级别的外观和性能大致相同。无论哪种方式,它们都将共享相同的架构。唯一的区别是 ElasticSearch 将类型差异视为语义级别,而不是应用程序必须管理差异。我的理解正确吗?
  • 是的,这听起来很对。我强烈不同意 Rotem 在他的回答中所说的:如果您提议的类型对于同一个字段键有不同的类型,它们不应该存储在同一个索引中,因为这些值将存储在相同的字段,这意味着如果它们都在查询期间加载,您将得到奇怪的结果和/或失败的查询和后端异常。 Obligatory example 显示了一些方面是如何丢失的,因为该字段被假定为数字,在分面期间无法计算字符串类型字段。

标签: elasticsearch


【解决方案1】:

不应该有任何明显的开销。

如果您将所有内容保持在同一类型下,则可以通过在对象上添加“类”字段并在搜索中在此字段上添加条件来按子类型过滤结果。

将不同的类建模为不同的 ES 类型的一个很好的理由是,同名字段的类型之间是否可能存在冲突。

也就是说,假设您的“car”类有一个包含整数的“color”字段,而您的“van”类也有一个“color”字段,但这个字段是一个字符串。 (愚蠢的例子,我知道,没有更好的主意)。

Elasticsearch 保存一个类型的映射(数据“模式”)。所以如果你在同一类型下同时索引“car”和“van”,就会出现字段类型冲突。类型中的字段可以具有一种特定类型。如果将字段设置为整数,然后尝试将字符串索引到其中,它将失败。

这是有关如何使用 Elasticsearch 类型的主要准则之一 - 将类型视为不能发生冲突的特定数据架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 2019-04-12
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2014-10-15
    • 2017-09-17
    • 2012-10-09
    相关资源
    最近更新 更多