什么是" Type"在Elasticsearch中意味着什么?

时间:2016-04-15 13:54:33

标签: elasticsearch types

我对Elasticsearch的文档感到困惑。

Basic Concepts: Type中,"输入"在某种程度上像MongoDB中的集合:

  

在此索引中,您可以为用户数据定义类型,为博客数据定义另一种类型,为评论数据定义另一种类型。

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

  

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

不是"用户"和#34;博客"上面提到有相互排斥的字段? 例如:有" name"," age" "用户"和" createdAt","内容" for" blog"。

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

index< =>数据库

type< =>集合

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

2 个答案:

答案 0 :(得分:1)

  

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

type只是Elasticsearch中的另一个字段,在最基本的层面上。执行GET /my_index/my_type/_search ES时,会为字段my_type运行_type值的预过滤器 - 它就像一个自动过滤器。

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

如果您的type1字段f1以及f2type2的字段为f1f3,则会有文档使用字段f1f2f3。为什么这很重要 - 当使用在字段f1中搜索值的查询计算文档的分数时,字段f1中的字词频率将全局(均为{{ 1}}和type1)因此,如果您从type2搜索f1中的某个值,那么您获得的分数也会受到type1的值的轻微影响f1

另外,请不要只需遵循主键/外键方法来定义ES中的父/子关系,就不要将一组SQL表转换为ES。

答案 1 :(得分:-1)

You're right, index == database and type == collection for elasticsearch. In RDBMS terms, index is a database and type can be a table which contains many rows(document in elasticsearch).

You could have a different index maintaining user information, with the "name", "age" and other such fields generally attributed to a person, and a different one for blogs with "createdAt", "content", etc. Yet, you might want to have a "user" field inside each blog document to be able to identify the person who posted it. Later, you can apply application-side joins, if need be.