Elasticsearch:更改索引中字段的数据类型的方法

这篇具有很好参考价值的文章主要介绍了Elasticsearch:更改索引中字段的数据类型的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.问题描述:

        需要将已有索引中的已有字段作为新的查询条件,需求中需要对该字段进行范围查询,当前字段为keyword类型的数字,此时发现查询所得结果与预期不符合。

2.问题拆解:

2.1发现问题:

索引字段数据类型不合理

2.2问题本质:

需要将keyword类型的转换成数值类型,以便执行range query范围查询操作。因为keywork类型本质是字符串类型的一种,如果以keyword类型做字符串处理比的是首字符的ASCII码。

2.3方案讨论:

如何进行字段类型转换?

对于三种方案来说,方案一贴合业务,方案二网络上也存在很多操作文档,方案三的文档较少在此给出操作步骤。

方案一:重新建立索引,更正数据类型,重新导入数据

特点:可以从根本上解决问题,但是不够灵活,所有依赖当前索引的服务需要重新上线将查询/写入指向新的索引。

方案二:reindex+alias别名零停机方案

特点:重新建立索引并且更正数据类型,reindex重新导入数据,使用alias别名的方式让用户无感知,依赖当前索引的服务也无需做任何操作。

方案三:convert ingest预处理 + reindex结合

特点:无需重新创建索引,哪个字段不满足就更改哪个字段

3.convert ingest预处理 + reindex结合具体实现:

3.1创建索引

PUT student 
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
   
  "mappings": {
    "student":{
      "properties":{
        "obj":{
          "type":"object",
          "properties":{
            "id":{
          "type":"integer"
        },
        "name":{
          "type":"keyword"
        },
        "age":{
          "type":"keyword"
        }
          }
        }
      }
    }
  }
}

3.2写入数据

POST student/student/1
{
  "obj": [
    {
      "id": 1,
      "age": "21",
      "name": "项目1"
    },
    {
      "id": 2,
      "age": "51",
      "name": "项目2"
    }
  ]
}

POST student/student/2
{
  "obj": [
    {
      "id": 1,
      "age": "21",
      "name": "项目1"
    },
    {
      "id": 2,
      "age": "51",
      "name": "项目2"
    }
  ]
}

POST student/student/3
{
  "obj": [
    {
      "id": 1,
      "age": "21",
      "name": "项目1"
    },
    {
      "id": 2,
      "age": "51",
      "name": "项目2"
    }
  ]
}

3.3数据预处理convert

PUT _ingest/pipeline/test_pipeline
{
  "processors": [
    {
      "foreach": {
        "field": "obj",
        "processor": {
          "convert": {
            "field": "_ingest._value.age",
            "type": "integer",
            "ignore_failure": true
          }
        }
      }
    }
  ]
}

3.4数据reindex迁移

POST _reindex
{
  "source": {"index": "student"},
  "dest": {"index": "student1", "pipeline": "test_pipeline"}
}

3.5观察结果并分析

        查询student1的结果为,可以观察到age的数据类型已经转换为integer,反观student的查询结果,age的数据类型依旧为keyword,写入新的数据后观察查询结果依旧如此:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "student1",
        "_type" : "student",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "obj" : [
            {
              "name" : "项目1",
              "id" : 1,
              "age" : 21
            },
            {
              "name" : "项目2",
              "id" : 2,
              "age" : 51
            }
          ]
        }
      },
      {
        "_index" : "student1",
        "_type" : "student",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "obj" : [
            {
              "name" : "项目1",
              "id" : 1,
              "age" : 21
            },
            {
              "name" : "项目2",
              "id" : 2,
              "age" : 51
            },
            {
              "name" : "项目3",
              "id" : 11,
              "age" : 11
            },
            {
              "name" : "项目4",
              "id" : 22,
              "age" : 31
            }
          ]
        }
      },
      {
        "_index" : "student1",
        "_type" : "student",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "obj" : [
            {
              "name" : "项目1",
              "id" : 1,
              "age" : 21
            },
            {
              "name" : "项目2",
              "id" : 2,
              "age" : 51
            }
          ]
        }
      }
    ]
  }
}

4.总结:

对于上述三种方案的取舍要取决于具体业务场景以及服务之间依赖关系是否紧密,如果调用方可以接受重新切换索引,可以酌情考虑方案一和方案三,方案一虽然操作起来较为繁琐,但原有的索引可以删除,节省内存空间。方案三虽然操作简单但是原有索引不可删除,若不计成本的情况下可以方案三更优。若调用方较多链路复杂,调用方不可接受上线切换索引则可以考虑方案二。文章来源地址https://www.toymoban.com/news/detail-482624.html

到了这里,关于Elasticsearch:更改索引中字段的数据类型的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch - 索引增加字段并查询增加字段前的历史数据

    1. 问题引入 我们项目中有一个需求:ElasticSearch存在很多历史数据,然后需求中索引新增了一个字段,我们需要根据条件查询出历史数据,但历史数据中这个新增的字段并不存在,如何查询到历史数据呢? 1. 索引2个文档 2. 给索引增加新的字段 3. 再次索引1个文档 这个文档新

    2024年02月10日
    浏览(68)
  • Hive更改字段类型的正确姿势

    step1 更改表名 step2 创建一个和原来表结构相同的名字 step3 原来数据按分区动态插入

    2024年02月15日
    浏览(39)
  • Elasticsearch (ES) 搜索引擎: 数据类型、动态映射、多类型(子字段)

    原文链接:https://xiets.blog.csdn.net/article/details/132348634 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) ES 映射字段的 数据类型 ,官网文档参考:Field data types。 下面是 ES 常用的一些基本数据类型。 字符串 类型: keyword :类型。 text :文本类型。

    2024年03月23日
    浏览(67)
  • ElasticSearch创建后的索引如何修改数据类型

    一、前言 在 Elasticsearch 中,一旦创建索引,就不能更改现有字段的数据类型。如果您需要更改数据类型,则需要重新创建索引并使用新的数据类型。以下针对各种业务场景总结几种修改方法。 二、【方法一】删除重建 这种方式的使用场景为当前索引库数据量不大,而且可

    2024年02月13日
    浏览(54)
  • ElasticSearch系列 - SpringBoot整合ES:映射中定义字段的数据类型及属性

    ElasticSearch - SpringBoot整合ES:映射定义字段的数据类型及属性 01. ElasticSearch 搜索结果的准确性和召回率是什么? 在Elasticsearch中,搜索结果的准确性和召回率是非常重要的指标,它们反映了搜索引擎的性能和效果。以下是这两个指标的定义和解释: 准确性:搜索结果的准确性

    2024年02月08日
    浏览(47)
  • 类型转换与索引使用与字段缓存问题

    ** 1: 类型转换与索引使用** 假设你有一个MySQL表格 users ,其中有一个 age 列,数据类型是整数(INT),并且为该列创建了一个索引。然后你执行以下查询: 在这个查询中,你将整数值 \\\'25\\\' 用作字符串来匹配 age 列。MySQL 可能会自动进行类型转换,将字符串转换为整数,然后再

    2024年02月13日
    浏览(39)
  • ElasticSearch索引mapping添加字段

    ES版本5.3.0,在已存在的索引mapping中添加字段。 如下: my_index索引名称,my_type为索引类型名称,new_field_name为新增的字段名称。 如下: 返回为true代表添加操作成功。

    2024年02月13日
    浏览(48)
  • 【Elasticsearch学习笔记二】es的Mapping字段映射、Mapping字段常用类型、Mapping映射的创建、查看和更新、es数据迁移、ik分词器

    目录 1、Mapping字段映射概述 2、Mapping字段常用类型 3、映射中对时间类型详解 1)采取自动映射器来映射 2)手工映射提前指定日期类型 4、ES的keyword的属性ignore_above 5、Mapping映射的查看和创建 1)查看mapping信息:GET 索引名/_mapping 2)创建映射:PUT /索引名 3) 查看所有索引映

    2024年01月20日
    浏览(61)
  • elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引

    search_as_you_type字段类型用于自动补全,当用户输入搜索的时候,还没输完就可以提示用户相关内容。as_you_type应该是说当你打字的时候。它会给索引里的这个类型的字段添加一些子字段_2gram _3gram和_index_prefix。_2gram的意思是,如果一个值是abcd, 2 gram就是ab bc cd, 3 gram就是

    2024年02月12日
    浏览(49)
  • Elasticsearch Mapping字段未支持索引导致搜索失效

    生产上Es根据一个时间字段搜索,却没有返回数据 根据命令: GET indexName/_mapping 查看 count_name设置了 “index”: false 导致根据该字段搜索导致索引不生效。 ES的mappings 定义好了生成索引后是不支持修改现有的字段的,只能新增属性。 使用 reindex 命令处理 1、运行命令: GET ind

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包