【问题标题】:What does the "Type" mean in Elasticsearch?Elasticsearch 中的“类型”是什么意思?
【发布时间】:2016-08-07 13:01:24
【问题描述】:

我完全被 Elasticsearch 的文档弄糊涂了。

Basic Concepts: Type 中,“类型”在某种程度上类似于 MongoDB 中的集合:

在此索引中,您可以定义用户数据类型、博客数据类型以及 cmets 数据类型。

但在Types and Mappings: Type Takeaways 中,它说:

类型不太适合完全不同类型的数据。如果您的两种类型具有互斥的字段集,则意味着您的索引的一半将包含“空”值(字段将是稀疏的),这最终会导致性能问题。

上面提到的“用户”和“博客”不是有互斥的字段集吗? 例如:“user”有“name”、“age”字段,“blog”有“createdAt”、“content”。

我以前认为 Elasticsearch 和 MongoDB 的映射关系是:

索引 数据库

类型 集合

不是吗? 如果不是,推荐它们之间的映射样式是什么?

【问题讨论】:

    标签: elasticsearch types


    【解决方案1】:

    类型不太适合完全不同类型的数据。如果您的两种类型具有互斥的字段集,则意味着您的索引的一半将包含“空”值(字段将是稀疏的),这最终会导致性能问题。

    type 只是 Elasticsearch 中的另一个字段,处于非常基础的级别。当您执行 GET /my_index/my_type/_search 时,ES 将为字段 my_type 的值运行预过滤器 _type - 这就像一个自动过滤器。

    不要将索引和类型视为 SQL 世界中的数据库和表,因为它们不是那样的。

    如果您有type1 字段f1f2type2 字段f1f3 在索引中会有字段f1f2、@987654333 的文档@。为什么这很重要 - 当将使用在字段 f1 中搜索值的查询来计算文档的分数时,字段 f1 中的术语频率将是globaltype1 和 @987654337 @) 所以如果你从type1 中搜索f1 中的某个值,那么你得到的分数也会受到f1type2 中的值的轻微影响。

    另外,请不要通过简单地按照主键/外键方法在 ES 中定义父/子关系来将一组 SQL 表转换为 ES。

    【讨论】:

    • 那么“user”和“blog”应该放在不同的索引中,还是不同的类型放在一个索引中?
    • 这取决于数据:在查询中是否需要它们之间的关系?会有更多属于用户的博客吗?多少?用户有多复杂?这么简单,你可以把它放在同一个索引和类型中,这样你就可以简单地复制数据?顺便说一句,在 ES 世界中,多次使用非规范化数据要好得多(比如将相同的用户数据放在用户拥有的每个博客中)。
    【解决方案2】:

    你是对的,索引 == 数据库和类型 == 用于弹性搜索的集合。在 RDBMS 术语中,index 是一个数据库,type 可以是一个包含许多行的表(在 elasticsearch 中document)。

    您可以使用不同的索引来维护用户信息,其中“姓名”、“年龄”和其他此类字段通常归于某个人,而对于具有“createdAt”、“内容”等的博客则使用不同的索引。然而,您可能希望在每个博客文档中都有一个“用户”字段,以便能够识别发布它的人。稍后,如果需要,您可以申请application-side joins

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 2015-02-20
      • 1970-01-01
      • 2011-07-18
      • 2016-09-15
      • 2015-01-03
      • 1970-01-01
      相关资源
      最近更新 更多