elasticsearch 什么是;“类型”;在弹性搜索中是什么意思?,elasticsearch,types,elasticsearch,Types" /> elasticsearch 什么是;“类型”;在弹性搜索中是什么意思?,elasticsearch,types,elasticsearch,Types" />

elasticsearch 什么是;“类型”;在弹性搜索中是什么意思?

elasticsearch 什么是;“类型”;在弹性搜索中是什么意思?,elasticsearch,types,elasticsearch,Types,我完全被Elasticsearch的文档搞糊涂了 在中,“类型”与MongoDB中的集合有些相似: 在此索引中,您可以为用户数据定义一种类型,为博客数据定义另一种类型,为评论数据定义另一种类型 但实际上,它说: 类型不太适合于完全不同的数据类型。如果您的两种类型都有互斥的字段集,这意味着索引的一半将包含“空”值(字段将稀疏),这将最终导致性能问题 上面提到的“用户”和“博客”不是有相互排斥的字段集吗? 例如:“用户”有“姓名”、“年龄”字段,“博客”有“创建日期”、“内容”字段 我习惯于相信El

我完全被Elasticsearch的文档搞糊涂了

在中,“类型”与MongoDB中的集合有些相似:

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

但实际上,它说:

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

上面提到的“用户”和“博客”不是有相互排斥的字段集吗? 例如:“用户”有“姓名”、“年龄”字段,“博客”有“创建日期”、“内容”字段

我习惯于相信Elasticsearch和MongoDB之间的映射关系是:

索引数据库

类型集合

对不对?
如果不是,建议它们之间的映射样式是什么?

没错,索引==数据库,类型==用于elasticsearch的集合。在RDBMS术语中,
索引
是一个数据库,
类型
可以是一个包含许多行的表(
elasticsearch中的文档

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

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

类型
只是Elasticsearch中的另一个字段,处于非常基本的级别。当您执行
GET/my\u index/my\u type/\u search
ES将对
my\u type
字段
\u type
的值运行预筛选-这就像一个自动筛选一样

不要将索引和类型视为SQL世界中的数据库和表,因为它们并非如此

如果索引中的
type1
带有
f1
f2
字段,以及
type2
带有
f1
f3
字段,则会有带有
f1
f2
f3
字段的文档。为什么这很重要-当使用搜索字段
f1
中的值的查询来计算文档的分数时,字段
f1
中的术语频率将是全局
type1
type2
)因此,如果从
type1
中搜索
f1
中的某个值,则返回的分数也会受到
type2
f1
值的轻微影响


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

所以“用户”和“博客”应该放在不同的索引中,或者放在一个索引中的不同类型中?这取决于数据:您在查询中需要它们之间的关系吗?是否会有更多属于某个用户的博客?有多少用户有多复杂?它非常简单,您可以将它放在相同的索引和类型中,这样您就可以简单地复制数据了?顺便说一句,在ES世界中,很多时候使用非规范化数据要好得多(比如在用户拥有的每个博客中放置相同的用户数据)。