ElasticSearch: Index 和 Type 的区别

 

对于 ES 的新用户来说,有一个常见的问题:要存储一批新的数据时,应该在已有 index 里新建一个 type,还是给它新建一个 index?要想回答这个问题,我们必须先理解这两者是怎么实现的。

过去,我们为了让 ES 更容易理解,经常用关系型数据库做一个比喻: index 就像关系型数据库里的 database, type 就像 database 里的 table。但是这并不正确。由于两种数据库存储数据的方式是如此不同,任何比喻都是没有意义的。这种比喻往往会导致对 type 的滥用。

Index 是什么

Index 存储在多个分片中,其中每一个分片都是一个独立的 Lucene Index。这就应该能提醒你,添加新 index 应该有个限度:每个 Lucene Index 都需要消耗一些磁盘,内存和文件描述符。因此,一个大的 index 比多个小 index 效率更高:Lucene Index 的固定开销被摊分到更多文档上了。

另一个重要因素是你准备怎么搜索你的数据。在搜索时,每个分片都需要搜索一次, 然后 ES 会合并来自所有分片的结果。例如,你要搜索 10 个 index,每个 index 有 5 个分片,那么协调这次搜索的节点就需要合并 5x10=50 个分片的结果。这也是一个你需要注意的地方:如果有太多分片的结果需要合并,或者你发起了一个结果巨大的搜索请求,合并任务会需要大量 CPU 和内存资源。这是第二个让 index 少一些的理由。

Type 是什么

使用 type 允许我们在一个 index 里存储多种类型的数据,这样就可以减少 index 的数量了。在使用时,向每个文档加入 _type 字段,在指定 type 搜索时就会被用于过滤。使用 type 的一个好处是,搜索一个 index 下的多个 type,和只搜索一个 type 相比没有额外的开销 —— 需要合并结果的分片数量是一样的。

但是,这也是有限制的:

  • 不同 type 里的字段需要保持一致。例如,一个 index 下的不同 type 里有两个名字相同的字段,他们的类型(string, date 等等)和配置也必须相同。
  • 只在某个 type 里存在的字段,在其他没有该字段的 type 中也会消耗资源。这是 Lucene Index 带来的常见问题:它不喜欢稀疏。由于连续文档之间的差异太大,稀疏的 posting list 的压缩效率不高。这个问题在 doc value 上更为严重:为了提高速度,doc value 通常会为每个文档预留一个固定大小的空间,以便文档可以被高速检索。这意味着,如果 Lucene 确定它需要一个字节来存储某个数字类型的字段,它同样会给没有这个字段的文档预留一个字节。未来版本的 ES 会在这方面做一些改进,但是我仍然建议你在建模的时候尽量避免稀疏。[1]
  • 得分是由 index 内的统计数据来决定的。也就是说,一个 type 中的文档会影响另一个 type 中的文档的得分。

这意味着,只有同一个 index 的中的 type 都有类似的映射 (mapping) 时,才应该使用 type。否则,使用多个 type 可能比使用多个 index 消耗的资源更多。

我应该用哪个

这是个困难的问题,它的答案取决于你用的硬件、数据和用例。首先你要明白 type 是有用的,因为它能减少 ES 需要管理的 Lucene Index 的数量。但是也有另外一种方式可以减少这个数量:创建 index 的时候让它的分片少一些。例如,与其在一个 index 里塞上 5 个 type,不如创建 5 个只有一个分片的 index。

在你做决定的时候可以问自己下面几个问题:

  • 你需要使用父子文档吗?如果需要,只能在一个 index 里建立多个 type。
  • 你的文档的映射是否相似?如果不相似,使用多个 index。
  • 如果你的每个 type 都有足够多的文档,Lucene Index 的开销可以被分摊掉,你就可以安全的使用多个 index 了。如果有必要的话,可以把分片数量设小一点。
  • 如果文档不够多,你可以考虑把文档放进一个 index 里的多个 type 里,甚至放进一个 type 里。

总之,你可能有点惊讶,因为 type 的使用场景没有你想象的多,这是正确的。由于我们上面提到原因,在一个 index 中使用多个 type 的情景其实很少。如果你的数据有不同的映射,那就给他们分配不同的 index。但是请记住,如果不需要很高的写入吞吐量,或者存储的文档数量不多,你可以通过减少 index 的分片来使集群中的分片数量保持合理。


[1] posting list 和 doc value 都是 Lucene 的压缩技术,原理是保存后一个文档和前一个文档的差异,而不是完整的文档。

 

转载自:http://bayescafe.com/database/elasticsearch-using-index-or-type.html贝叶书博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ES(Elasticsearch)是一个分布式的搜索和分析引擎,常用于构建全文搜索引擎、日志分析、数据分析等场景。下面是indextype和mapping在ES中的作用: 1. Index(索引):在ES中,index是存储和索引文档的地方。每个index可以包含多个type,类似于关系型数据库中的表。一个index通常代表一种数据类型或者数据集合。 例如,一个名为“products”的index可以用于存储产品数据,另一个名为“users”的index可以用于存储用户数据。 2. Type(类型):在ES中,typeindex中文档的逻辑分类,类似于关系型数据库中的表中的类型。每个type包含一个或多个文档(document),每个文档有自己的字段(field)。不同的type可以共享相同的mapping,也可以拥有自己独有的mapping。 例如,在“products”索引中,可以定义两个不同的type:“book”和“movie”。每个type都有自己的字段,例如“book”type可能有字段“title”、“author”、“publisher”,而“movie”type可能有字段“title”、“director”、“year”。 3. Mapping(映射):在ES中,mapping用于定义文档的字段和属性。每个index中的每个type都有自己的mapping。mapping定义了字段的类型、是否需要索引、是否存储等信息。 例如,在“products”索引中,对于“book”type,可以定义字段“title”为“text”类型,需要索引,但不需要存储。对于“author”字段,可以定义为“keyword”类型,需要索引并且需要存储。这些mapping定义了文档的结构和特征,可以支持高效的搜索和聚合操作。 总之,indextype和mapping是ES中非常重要的概念,可以帮助我们组织和管理数据,并实现高效的搜索和分析。 ### 回答2: 在Elasticsearch(ES)中,indextype和mapping都是用来组织和管理存储在集群中的数据的重要概念。 1. Index(索引):索引是ES最基本的概念之一,代表了一个逻辑上的数据存储容器。它类似于传统数据库中的数据库,用于将数据进行组织和分割。每个索引都有一个唯一的名称,用于标识和访问其中存储的数据。一个ES集群可以包含多个索引,每个索引可以包含多个文档和其相关信息。 2. Type(类型):类型是指索引内的逻辑分组,用于将索引内的文档进一步分类。一个索引可以包含多个类型,每个类型通常表示一种相似的数据。例如,在一个名为"blog"的索引中,可以有类型"post"和"type",分别用于存储博客文章和评论。类型不再是ES7.x及以后版本的概念,ES7.x及以后的版本中将使用单个索引来存储数据。 3. Mapping(映射):映射是用来定义索引中的数据结构和类型的方式。它类似于传统数据库中的表结构,通过映射可以指定字段的类型、分析器、是否索引、是否存储等属性。映射将数据的结构定义为类型、字段和属性的集合,用于确定数据如何被存储和搜索。在索引创建之前,通过映射可以提前规划好数据的结构,以便进行更有效的搜索和聚合操作。 综上所述,indextype和mapping在ES中扮演着重要的角色。索引用于组织和分割数据,类型用于进一步分类和组织索引内的数据,映射用于定义和控制数据的结构和属性。它们共同促使ES成为一个强大的搜索和分析引擎,能够处理和查询大规模的分布式数据。 ### 回答3: 在Elasticsearch(ES)中,indextype和mapping都是非常重要的概念。 首先,index是ES中用于存储、组织和检索文档的单元。它类似于关系数据库中的数据库。每个index都有一个唯一的名称,我们可以在一个ES集群中创建多个index来存储不同类型的数据。index中的文档被分配到不同的分片中,以便实现高可用性和扩展性。 其次,typeindex中的逻辑分类或分组。同一个index中的文档可以被分为不同的type,以便更好地组织数据。type是可选的,可以灵活地定义,用于根据业务需求创建不同类型的文档结构。然而,在ES 7.0版本之后,type已经被弃用,建议直接使用index来组织数据。 最后,mapping是定义index中文档结构和字段的方式。mapping描述了index中的每个字段的数据类型、分词器和其他属性。通过mapping,ES可以自动识别文档中的字段并进行正确的数据解析和处理。mapping还允许我们为不同的字段添加搜索、过滤和聚合等功能。ES提供了自动创建mapping的功能,也可以手动创建和修改mapping来满足特定的业务需求。 总结来说,index用于存储、组织和检索文档,type用于在index内部进行逻辑分类,而mapping则定义了index中文档的结构和字段的属性。这些都是ES中关键的概念,对于有效地管理和利用数据非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值