返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Elasticsearch的删除映射类型操作示例
  • 284
分享到

Elasticsearch的删除映射类型操作示例

2024-04-02 19:04:59 284人浏览 薄情痞子
摘要

目录一 前言二 什么是映射类型?三 为什么要删除映射类型?四 映射类型的替代方法4.1 将映射类型分开存储在索引中4.2 自定义类型字段回到顶部五 没有映射类型的父/子六 删除映射类

一 前言

官方解释:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/removal-of-types.html

在elasticsearch6.0.0或更高的版本中创建索引仅能包含单个映射类型。在具有多种映射类型的5.x版本中创建的索引将继续像以前一样在elasticsearch6.x中运行。类型将在elasticsearch7.0.0中的api中弃用,并在8.0.0中完全删除。

二 什么是映射类型?

从elasticsearch发布以来,每个文档都存储在单个索引中并分配了单个映射类型。映射类型用于表示要编制索引的文档或实体的类型。例如微博(twitter)索引可能具有用户(user)类型和推文(tweet)两个类型。

每种映射类型都可以有自己的字段,因此用户(user)类型可能有 full_name、user_name、email字段;而推文(tweet)类型可能有content、tweet_at字段和用户(user)类型的user_name字段。每个文档都有一个_type包含类型名称的元字段,通过在URL中指定类型名称,搜索可以限制为一种或多种类型:

GET twitter/user,tweet/_search
{
  "query":{
    "match":{
      "user_name":"kimchy"
    }
  }
}

该_type字段与文档组合_id以生成_uid字段,因此具有相同类型的文档_id可以存储在单个索引中。
映射类型也用于在文档中建立父子关系,因此类型的文档question可以是类型文档的父类answer。
扯了半天淡,一切不都是挺好的嘛?那还为啥要删除映射类型呢?

三 为什么要删除映射类型?

最初(其实到现在),为了便于理解elasticsearch的数据组织,通常拿elasticsearch和关系型数据库做对比,比如我们谈到一个es索引(index)时,通常将它比喻为类似于sql数据库中的database,而类型(type)等同于SQL数据库中的表。

这真是一个糟糕的比喻!让我们有了错误理解。因为在SQL数据库中,表彼此独立,一个表中的字段与另一个表中具有相同名称的字段无关,而映射类型中的字段不是这种情况。

在elasticsearch的索引中,不同映射类型具有相同名称的字段在内部由相同的Lucene字段支持。换句话说,使用上面的示例,用户(user)类型中的user_name字段存储在和推文(tweet)类型中的user_name字段完全相同的字段中,而且两种类型中的user_name字段必须具有相同的映射(定义)。

当我们希望删除一个类型的日期字段和同一个索引中另一个类型的布尔字段时,这可能会导致挫败感(可以理解为删除失败)。

最重要的是,在同一索引中存储具有很少或没有共同字段的不同实体会导致稀疏数据并干扰Lucene有效压缩文档的能力。

出于这些原因,我们决定从elasticsearch中删除映射类型的概念。

四 映射类型的替代方法

4.1 将映射类型分开存储在索引中

第一种方法是每个文档类型都有一个索引,例如微博(twitter)索引中,我们可以将推文(tweet)类型和用户(user)类型分开,分别存储在独立的索引中。这样两个相互的索引就不会引起字段冲突了。

这中方法有两个好处:

  • 数据更可能是密集的,因此受益于Lucene中使用的压缩技术。
  • 用于全文搜索评分的词条统计将会更精确,应为同一索引中的所有文档都代表单个实体。

每个索引的大小可以根据其包含的文档数量进行适当的调整,比如我们为用户(user)类型分配较少的主分片,而为推文(tweet)类型分配较多的主分片。

4.2 自定义类型字段回到顶部

当然了,集群中可以存储多少个主分片是有限制的,我们不希望仅为几千个文档的集合而浪费整个分片。在这种情况下,我们可以实现自己的自定义type字段,该字段的工作方式与旧的_type相似。
还是上面微博(twitter)例子,最初,它的映射类型看起来是这样的:

PUT twitter
{
  "mappings": {
    "user":{
      "properties":{
        "name":{
          "type":"text"
        },
        "user_name":{
          "type":"keyWord"
        },
        "email":{
          "type":"keyword"
        }
      }
    },
    "tweet":{
      "properties":{
        "content":{
          "type":"text"
        },
        "user_name":{
          "type":"keyword"
        },
        "tweet_at":{
          "type":"date"
        }
      }
    }
  }
}
PUT twitter/user/kimchy
{
  "name":"狗子",
  "user_name":"二狗子",
  "email":"dog@twodog.com"
}
PUT twitter/tweet/1
{
  "name":"kimchy",
  "tweet_ad":"2019-04-30T10:26:20Z",
  "content":"单身狗求包养"
}
GET twitter/tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}

如上示例,请在5.x及以下版本测试
我们也可以通过添加自定义type字段来实现相同目的:

PUT twitter
{
  "mappings": {
    "doc":{
      "properties":{
        "type":{
          "type":"keyword"
        },
        "name":{
          "type":"text"
        },
        "user_name":{
          "type":"keyword"
        },
        "email":{
          "type":"text"
        },
        "content":{
          "type":"text"
        },
        "tweet_at":{
          "type":"date"
        }
      }  
    }
  }
}
PUT twitter/doc/user-kimchy
{
  "type":"user",
  "name":"狗子",
  "user_name":"二狗子",
  "email":"dog@twodog.com"
}
PUT twitter/doc/tweet-1
{
  "type":"tweet",
  "user_name":"kimchy",
  "tweet_at":"2019-04-30T10:26:20Z",
  "content":"单身狗求包养"
}
GET twitter/_search
{
  "query": {
    "bool": {
      "must":[
        {
          "match": {
            "user_name": "kimchy"
          }
        }
      ],
      "filter": {
        "match":{
          "type":"tweet"
        }
      }
    }
  }
}

上述示例6.5.4版本运行无误。

五 没有映射类型的父/子

以前,通过将一个映射类型设置为父级,将一个或多个其他映射类型设置为子级来表示父子关系。现在,没有了多类型,我们就不能再使用这种语法了。除了表示文档之间的关系方式已改为使用新的join字段之外,父子特征将继续像以前一样运行。

六 删除映射类型的计划

这个删除映射类型的计划,对于用户来说是一个很大的变化,所以我们试图让它尽可能轻松,更改将如下所示:

在elasticsearch5.6.0中:

  • index.mapping.single_type:true在索引上设置将启用在6.0中强制执行的单索引类型。
  • 父子的join字段替换可用于在5.6中创建索引。

在elasticsearch6.x中:

  • 在5.x中创建的索引将继续在6.x中运行,就像在5.x中一样。
  • 在6.x中创建的索引仅允许每个索引使用单一类型,任何字段都可以用于该类型,但必须是唯一的。
  • 该_type名称可以不再与_id组合形成_uid字段,_uid字段已成为_id字段的别名。
  • 新索引不再支持旧的父/子关系,而是应该使用连接字段。
  • 不推荐使用_default_mapping类型。
  • 在6.7中,索引创建、索引模板和映射API支持查询字符串参数(include_type_name),该参数仅表示请求和响应是否应该包含类型名称,默认为true,应该设置为一个显式值,以便准备升级到7.0。未设置include_type_name将导致一个弃用警告,没有显式类型的索引将使用默认的类型名称_doc。

在elasticsearch7.x中:

  • 不推荐在请求中指定类型。例如,索引文档不再需要文档类型。对于自动生成的id,新的索引API在显式ids和POST {index_name}/_doc的情况下是PUT {index_name}/_doc/{id}。
  • 索引创建,索引模板和映射API中的include_type_name参数将默认为false,未设置参数将导致启动警告。
  • 删除了_default_mapping类型。

在elasticsearch8.x中:

  • 不在支持在请求中指定类型。
  • include_type_name参数已删除。

七将多类型索引迁移到单一类型

Reindex API可用于将多类型索引转换为单类型索引。下面的例子可以在Elasticsearch 5.6或Elasticsearch 6.x中使用。在6.x中,不需要指定index.mapping。默认为单一类型。

7.1 每种文档类型的索引

第一个示例将微博(twitter)索引拆分为推文(tweets)索引和用户(users)索引:

PUT users
{
  "mappings": {
    "user":{
      "properties":{
        "name":{
          "type":"text"
        },
        "user_name":{
          "type":"keyword"
        },
        "email":{
          "type":"keyword"
        }
      }
    }
  }
}
PUT tweets
{
  "mappings": {
    "tweet":{
      "properties":{
        "content":{
          "type":"text"
        },
        "user_name":{
          "type":"keyword"
        },
        "tweet_at":{
          "type":"date"
        }
      }
    }
  }
}
POST _reindex
{
  "source": {
    "index":"twitter",
    "type":"user"
  },
  "dest": {
    "index":"users"
  }
}
POST _reindex
{
  "source": {
    "index":"twitter",
    "type":"tweet"
  },
  "dest": {
    "index": "tweets"
  }
}

上述代码在6.5.4版本中运行无误。

上述的示例意思是,在之前我们在微博(twitter)索引中,有两个类型(tweet和user)。

现在要将两个类型分开,成为独立的索引。

所以,首先先创建出各自的索引(tweets和users),然后通过POST _reindex来完成迁移工作。

7.2 自定义类型字段

第二个示例添加自自定义的type字段,并将其设置为原始值_type。

它还添加了类型到id,以防有任何不同类型的文档具有冲突的id:

PUT new_twitter
{
  "mappings": {
    "doc":{
      "properties":{
        "type":{
          "type":"keyword"
        },
        "name":{
          "type":"text"
        },
        "user_name":{
          "type":"keyword"
        },
        "email":{
          "type":"keyword"
        },
        "content":{
          "type":"text"
        },
        "tweet_at":{
          "type":"date"
        }
      }
    }
  }
}
POST _reindex
{
  "source": {
    "index":"twitter"
  },
  "dest":{
    "index": "new_twitter"
  },
  "script": {
    "source": """
      ctx._source.type = ctx._type;
      ctx._id = ctx._type + "-" + ctx._id;
      ctx._type = "doc";
    """
  }
}

上述代码在6.5.4版本运行无误。

八 总结

总之,通篇看下来,如果对elasticsearch,尤其是各版本不太了解的话,这篇文档看着索然无味!重要的是看不懂,如果我们是新手,接触elasticsearch的时候,就是从6.x版本开始的,那只要记得,一个索引下面只能创建一个类型就行了,其中各字段都具有唯一性,如果在创建映射的时候,如果没有指定文档类型,那么该索引的默认索引类型是_doc,不指定文档id则会内部帮我们生成一个id字符串。

以上就是Elasticsearch的删除映射类型操作示例的详细内容,更多关于Elasticsearch删除映射类型的资料请关注编程网其它相关文章!

--结束END--

本文标题: Elasticsearch的删除映射类型操作示例

本文链接: https://lsjlt.com/news/146532.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Elasticsearch的删除映射类型操作示例
    目录一 前言二 什么是映射类型?三 为什么要删除映射类型?四 映射类型的替代方法4.1 将映射类型分开存储在索引中4.2 自定义类型字段回到顶部五 没有映射类型的父/子六 删除映射类...
    99+
    2024-04-02
  • Elasticsearch的删除映射类型怎么操作
    这篇文章主要讲解了“Elasticsearch的删除映射类型怎么操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Elasticsearch的删除映射类型怎么操作”吧!一 前言在elasti...
    99+
    2023-06-30
  • Elasticsearch映射字段数据类型及管理的方法
    本篇内容主要讲解“Elasticsearch映射字段数据类型及管理的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Elasticsearch映射字段数据类型及管理的方法”吧!Elastics...
    99+
    2023-06-30
  • GO将mysql 中 decimal 数据类型映射到 protobuf的操作方法
    目录protobuf中 float与double1、如何在rpc中优雅取出dcemial类型2、在rpc中 proto我们定义如下2.1、proto - double2.2、proto - float3、在go-zero...
    99+
    2024-04-02
  • GO将mysql 中 decimal 数据类型映射到 protobuf的操作方法
    目录protobuf中 float与double1、如何在rpc中优雅取出dcemial类型2、在rpc中 proto我们定义如下2.1、proto - double2.2、prot...
    99+
    2024-04-02
  • Elasticsearch文档索引基本操作增删改查示例
    接口幂等性 接口幂等性:数学概念,多次请求,相当于一次请求get,put,delete都是幂等性的接口post 存在幂等性的问题前端速度很快,点了两次,会生成两个订单用户在...
    99+
    2024-04-02
  • MongoDB中数组类型的操作示例
    这篇文章将为大家详细讲解有关MongoDB中数组类型的操作示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在MongoDB的模式中,我们经常将一些数据存储到数组类型中,...
    99+
    2024-04-02
  • ​Jedis对redis五大类型的操作示例
    这篇文章给大家分享的是有关Jedis对redis五大类型的操作示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Jedis对redis的五大类型的操作:字符串、列表、散列、集合、...
    99+
    2024-04-02
  • SQL更新与删除数据操作示例详解
    目录1、更新数据2、根据其他表更新数据3、删除数据4、根据其他表删除数据对于不加WHERE条件的UPDATE和DELETE要格外谨慎! 1、更新数据 1.1 更新全部数据:使用UPDATE关键字。语法如下...
    99+
    2023-01-05
    SQL更新数据 SQL删除数据
  • Jedis对redis五大类型操作的示例分析
    小编给大家分享一下Jedis对redis五大类型操作的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!JedisUtil这里的测试用例采用junit4进行运行,准备代码如下:private static&n...
    99+
    2023-05-30
    redis jedis
  • java技巧:反射判断field类型的操作
    JAVA 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。 其中,该修饰符是java.lang.reflect.Modifier的静态属性...
    99+
    2024-04-02
  • Java泛型的类型擦除示例详解
    目录前言泛型的类型擦除原则是:1 擦除类定义中的类型参数1.1 无限制类型擦除1.2 有限制类型擦除2 擦除方法定义中的类型参数3 桥接方法和泛型的多态总结参考资料前言 Java泛型...
    99+
    2024-04-02
  • java泛型中类型擦除的转换示例
    这篇文章给大家分享的是有关java泛型中类型擦除的转换示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用...
    99+
    2023-06-14
  • PostgreSQL数据库事务插入删除及更新操作示例
    目录INSERTDELETEUPDATE事务INSERT 使用INSERT语句可以向表中插入数据。 创建一个表: CREATE TABLE ProductIns (produ...
    99+
    2024-04-02
  • Oracle中CLOB大数据字段类型操作的示例分析
    这篇文章主要为大家展示了“Oracle中CLOB大数据字段类型操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle中CLOB大数据字段类型操...
    99+
    2024-04-02
  • PHP中FTP操作类的示例分析
    这篇文章主要介绍了PHP中FTP操作类的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  &...
    99+
    2024-04-02
  • pytorch 带batch的tensor类型图像显示操作
    项目场景 pytorch训练时我们一般把数据集放到数据加载器里,然后分批拿出来训练。训练前我们一般还要看一下训练数据长啥样,也就是训练数据集可视化。 那么如何显示dataloader...
    99+
    2024-04-02
  • golang gorm的预加载及软删硬删的数据操作示例
    目录1. orm读写数据1. 创建1.1. 创建记录1.2. 默认值1.3. 在Callbacks中设置主键1.4. 扩展创建选项2. 查询2.1. Where查询条件 (...
    99+
    2024-04-02
  • JPA配置方式+逆向工程映射到Entity实体类的示例分析
    这篇文章主要为大家展示了“JPA配置方式+逆向工程映射到Entity实体类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JPA配置方式+逆向工程映射到Entity实体类的示例分析”这篇...
    99+
    2023-06-25
  • JS原型与继承操作的示例分析
    小编给大家分享一下JS原型与继承操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:<script>...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作