Elasticsearch关于type的那些事

Scroll Down

1.什么是type

   在Elasticsearch(下文简称es)中,有两个概念:index和type。有一种不恰当的比方,index相当于关系型数据库中的库,type相当于关系型数据库中的表。使用起来确实很相似,但也容易产生误导。
   实际上,index更近似于表,type只是index下的一个字段,只是可以通过type来区分index下不同类型的数据。同一个index下的不同type共享相同的字段。例如两个type都包含名称为a的字段,那两个type将共用字段a,而无法为两个type分别创建不同类型的字段a。

2.各版本对type的支持情况

Elasticsearch 5.x

  • 每个index内可以有多个type。
  • Elasticsearch 5.6.0版本,设置index.mapping.single_type: true,会限制每个index只允许一个type。

Elasticsearch 6.x

  • index创建方法与5.x版本相比没有变化。
  • 每个index只允许有一个type。type名字可以任意,但官方推荐将type命名为_doc,以便后续平滑升级到7.x。
    例如6.x的index API为PUT {index}/{type}/{id},7.x的index API为PUT {index}/_doc/{id},使用_doc命名,升级后无需修改请求路径。
  • Elasticsearch 6.7版本,index创建、index模板和mapping API支持include_type_name查询参数来指定请求和返回是否包含type名称。参数默认值是true,以便升级到7.0。如果不设置该参数,返回结果会包含一个警告。请求没有指定type时,会使用_doc为type。

Elasticsearch 7.x

  • index中的type被去除。
  • index API,手动指定id:PUT {index}/_doc/{id} ,自动生成id: POST {index}/_doc。在7.0中,_doc在请求路径中是一个固定值,不是type。
  • index创建、index模板和mapping API中的include_type_name参数默认值为false。如果设置该参数,会返回一个警告。

Elasticsearch 8.x

  • type在所有API请求中被去除。
  • include_type_name参数被去除。