我对Elasticsearch的文档感到困惑。
在Basic Concepts: Type中,"输入"在某种程度上像MongoDB中的集合:
在此索引中,您可以为用户数据定义类型,为博客数据定义另一种类型,为评论数据定义另一种类型。
但在Types and Mappings: Type Takeaways中,它说:
类型不太适合完全不同类型的数据。如果您的两种类型具有互斥的字段集,则意味着您的索引的一半将包含"空"值(字段将是稀疏的),这最终将导致性能问题。
不是"用户"和#34;博客"上面提到有相互排斥的字段? 例如:有" name"," age" "用户"和" createdAt","内容" for" blog"。
我以前认为Elasticsearch和MongoDB之间的映射关系是:
index< =>数据库
type< =>集合
不是吗? 如果没有,它们之间的推荐映射样式是什么?
答案 0 :(得分:1)
类型不太适合完全不同类型的数据。如果您的两种类型具有互斥的字段集,则意味着您的索引的一半将包含"空"值(字段将是稀疏的),这最终将导致性能问题。
type
只是Elasticsearch中的另一个字段,在最基本的层面上。执行GET /my_index/my_type/_search
ES时,会为字段my_type
运行_type
值的预过滤器 - 它就像一个自动过滤器。
不要将索引和类型视为SQL世界中的数据库和表,因为它们不是那样的。
如果您的type1
字段f1
以及f2
和type2
的字段为f1
和f3
,则会有文档使用字段f1
,f2
,f3
。为什么这很重要 - 当使用在字段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.