首页 > 其他分享 >elasticsearch版本升级type属性的变化

elasticsearch版本升级type属性的变化

时间:2022-09-05 15:01:57浏览次数:77  
标签:name 字段 版本升级 elasticsearch user 类型 type

type属性的由来
从Elasticsearch的第一个发布版本以来,每一个document都被存储在一个单独的index里,并被赋予了一个type,一个mapping代表一个type相关的数据类型以及索引类型。

例如,一个twitter索引可能有一个user类型和tweet类型。

每种type都有他自己的字段,所以user类型可能有一个full_name字段,一个user_name字段和一个email字段,而一个tweet类型可能有一个content字段,一个tweet_at字段,和user类型一样一个user_name字段。

每一个文档类型都有一个_type元字段来存储type名称,并且根据URL里指定的类型名称,查询(搜索)被限定在一个或多个类型(type)里:

GET /twitter/user,tweet/_search
{
"query": {
"match": {
"user_name": "nicola"
}
}
}
type为什么被干掉了
但是不知道何时起,有人将elasticsearch对标关系型数据库中的概念,这样便于理解,也便于处理问题,于是就有了下面的关系:

elasticsearch rdbms description
index db 数据库
type table 数据表
document row 数据行
field column 数据列
mapping schema 数据结构/类型

elasticsearch rdbms description
index db 数据库
type table 数据表
document row 数据行
field column 数据列
mapping schema 数据结构/类型

 

 

 

 

 

 

看上面的对照关系,一切都很完美,完全匹配,但是这也是一把双刃剑,玩惯了rdbms的人可能“误会”了elasticsearch,并按照rdbms的思想去构建elasticsearch,结果很快就发现了无数的坑,比如:

在关系型数据库里,table是相互独立的,一个table里的column和另外一个table的同名column没有关系,互不影响。但在type里字段却不是这样的。在一个Elasticsearch的index里,所有不同type的同名column内部使用的是同一个lucene字段存储。举例来说,user类型的user_name字段和tweet类型的user_name字段是存储在一个field里的,两个类型里的user_name必须有一样的field定义。

这可能导致一些问题,例如你希望同一个索引中"create_time"字段在一个类型里是存储日期值,在另外一个类型里存储字符串。

另外,按照Lucene存储的方式和特点,如果按照此种方式组织数据,会影响到底层的压缩比例和存储效率。

基于上面的原因,type在被误解后处于尴尬的地位,慢慢的版本迭代就被干掉了,在干掉一层数据结构后,es的数据结构变的简单明了,便于理解。

type的版本迭代
5.x及以前版本一个index有一个或者多个type
6.X版本一个index只有一个index
7.X版本移除了type,type相关的所有内容全部变成Deprecated,为了兼容升级和过渡,所有的7.X版本es数据写入后type字段都默认被置为_doc
8.X版本完全废弃type
type跨版本适配
针对6.X版本升级到7.X的数据,使用restful api查询es时不需要指定type即可以进行查询、结果与指定对应的type进行查询、type使用_doc进行查询效果是一样的
针对6.X版本升级到7.X的数据,使用restful api写入es时,不能指定type,如果处于某种原因必须指定type,则可以将type指定为_doc(比如使用6.X的restful api,这种场景详见一文讲解Elasticsearch java restful api 跨版本兼容解决方案),如果id相同,则数据会被覆盖,但是type保持原来的值,不会出现一个id对应多条数据的情况;如果id不相同,则会新写入一条type为_doc的数据
如果为了将来兼容和支持高版本的elasticsearch,建议使用restful client去支持elasticsearch相关的操作,并且尽量不要在api中有type这个参数,就算必须要需要,也建议在源生api中再封装一层,否则后续版本升级,适配的工作量会让你崩溃

在ElasticSearch升级到8.x之后,在自己使用kibana测试添加索引得时候,按照
正常得添加的时候,发现一直会报一个400错误,no handler found for uri。。。后来发现用系统默认的类型添加的时候就没问题,整整困扰了一天的原因是在el8以后不在支持索引,换成低版本的测试就没问题了

 

标签:name,字段,版本升级,elasticsearch,user,类型,type
From: https://www.cnblogs.com/yuarvin/p/16658155.html

相关文章

  • js判断变量数据类型typeof、instanceof、Object.prototype.toString.call()、 constru
    JavaScript有4种方法判断变量的类型,分别是typeof、instanceof、Object.prototype.toString.call()(对象原型链判断方法)、constructor(用于引用数据类型) typeof:常用于......
  • 2022 年要改掉的 10 个 TypeScript 坏习惯
    2022年要改掉的10个TypeScript坏习惯TypeScript和JavaScript在过去几年中不断进步,我们在过去几十年中建立的一些实践已经过时。有些可能永远没有意义。下面列出......
  • 使用 Node.js 构建基于 Typescript 的命令行界面 (CLI)
    使用Node.js构建基于Typescript的命令行界面(CLI)我们的目标是使用Typescript创建一个基于Node.js的命令行界面(CLI)。此设置包括顶级等待支持和ES模块导入。......
  • Typescript类型体操 - Trim
    题目中文实现Trim<T>,它是一个字符串类型,并返回一个新字符串,其中两端的空白符都已被删除。例如typetrimed=Trim<'HelloWorld'>//expectedtobe'HelloWorld......
  • Typescript类型体操 - Trim Left
    题目中文实现TrimLeft<T>,它接收确定的字符串类型并返回一个新的字符串,其中新返回的字符串删除了原字符串开头的空白字符串。例如typetrimed=TrimLeft<'HelloWo......
  • Typescript类型体操 - Promise.all
    题目中文键入函数PromiseAll,它接受PromiseLike对象数组,返回值应为Promise<T>,其中T是解析的结果数组。constpromise1=Promise.resolve(3);constpromise2=42;cons......
  • Typescript类型体操 - Type Lookup
    题目中文有时,您可能希望根据某个属性在联合类型中查找类型。在此挑战中,我们想通过在联合类型Cat|Dog中搜索公共type字段来获取相应的类型。换句话说,在以下示例中,我们......
  • 终止 Array.prototype.forEach 方法运行的方式
    通常情况下,Array.prototype上的遍历方法forEach、map、filter、...被调用以后会完整的遍历每一个数组项,并执行内部代码指令,无法被中途终止。但是可以通过 throw语句......
  • Typescript类型体操 - Chainable Options
    题目中文在JavaScript中我们经常会使用可串联(Chainable/Pipeline)的函数构造一个对象,但在TypeScript中,你能合理的给它赋上类型吗?在这个挑战中,你可以使用任意你喜欢的......
  • Typescript类型体操 - Tuple To Union
    题目中文实现泛型TupleToUnion<T>,它返回元组所有值的合集。例如typeArr=['1','2','3']typeTest=TupleToUnion<Arr>//expectedtobe'1'|'2'|'3'Eng......