本文基于Elasticsearch7.x

在聊重建索引之前, 我们先了解下Elasticsearch基本概念与核心原理

我们知道Elasticsearch的索引一旦创建是不可变更的, 如果我们要修改索引的Setting, Mapping, 这时就需要重建索引. Elasticsearch内置了两种重建索引的API:

  • Update By Query
    在现有索引上重建索引.
  • Reindex
    在其他索引上重建索引.

Update By Query

Update By Query API是在现有索引上重建索引, 我们来用实例了解下.

(1) 新增一个blogs文档

PUT /blogs/_doc/1
{"content": "Hadoop is cool","title": "hadoop"
}

(2) 查看Mapping

GET /blogs/_mapping

结果:

{"blogs" : {"mappings" : {"properties" : {"content" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"title" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}}}
}

(3) 修改Mapping

PUT /blogs/_mapping
{"properties": {"content": {"type": "text","fields": {"english": {"type": "text","analyzer": "english"}}}}
}

为content字段再添加一个子字段english, 其分词器为英语分词器.

(4) 查看Mapping

GET /blogs/_mapping

结果:

{"blogs" : {"mappings" : {"properties" : {"content" : {"type" : "text","fields" : {"english" : {"type" : "text","analyzer" : "english"},"keyword" : {"type" : "keyword","ignore_above" : 256}}},"title" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}}}
}

可以看到Mapping结构发生了变化, 但只对后面新增的文档生效, 旧文档的Mapping结构不会改变.

(5) 搜索之前写入的文档

GET /blogs/_search
{"query": {"match": {"content.english": "Hadoop"}}
}

结果:

"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]
}

最终结果证实了旧文档的索引没有发生变化.

(6) Update By Query 重建索引

POST /blogs/_update_by_query?conflicts=proceed

结果:

{"took" : 17,"timed_out" : false,"total" : 1,"updated" : 1,"deleted" : 0,"batches" : 1,"version_conflicts" : 0,"noops" : 0,"retries" : {"bulk" : 0,"search" : 0},"throttled_millis" : 0,"requests_per_second" : -1.0,"throttled_until_millis" : 0,"failures" : [ ]
}

conflicts=proceed表示在重建索引的过程中出现某个文档报错, 不要终止, 继续重建索引.

(7) 再次搜索之前写入的文档

GET /blogs/_search
{"query": {"match": {"content.english": "Hadoop"}}
}

结果:

"hits" : [{"_index" : "blogs","_type" : "_doc","_id" : "1","_score" : 0.2876821,"_source" : {"content" : "Hadoop is cool","title" : "hadoop"}
}

重建索引后旧文档的Mapping才修改.

Reindex

Reindex API是在其他索引上重建索引, 即将一个索引的数据复制到另一个索引中. Reindex APi 要求Mapping中的_source属性设置为enable(默认就是enable), 且Reindex只会复制数据, 不会复制Mapping, Setting结构.

Reindex常用属性

(1) version_type

乐观版本控制机制, 值有四种, 分别是:

  • internal
    默认. 将数据复制到另一个索引的过程中, 如果遇到相同的文档id, 直接覆盖.
  • external
    将数据复制到另一个索引的过程中, 如果遇到相同的文档id, 只有版本号更大才会覆盖.
  • external_gt
    同external.
  • external_gte
    版本号大于等于才会覆盖.

(2) op_type

  • index
    默认, 如果遇到相同文档id的数据, 则覆盖.
  • create
    遇到相同文档id的数据则报错.

(3) conflicts

  • abort
    重建索引过程中出现报错时终止重建索引.
  • proceed
    重建索引过程中出现报错时跳过, 继续重建索引.

实例

我们将Update By Query实例数据copy到一个新的索引中.

(1) 定义Mapping

PUT /blogs_fix
{"mappings": {"properties": {"content": {"type": "text","fields": {"english": {"type": "text","analyzer": "english"}}},"title": {"type": "keyword"}}}
}

(2) reindex

POST _reindex
{"source": {"index": "blogs"},"dest": {"index": "blogs_fix","version_type": "internal","op_type": "index"},"conflicts": "proceed"
}

(3) 查看数据

GET /blogs_fix/_doc/1

结果:

{"_index" : "blogs_fix","_type" : "_doc","_id" : "1","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"found" : true,"_source" : {"content" : "Hadoop is cool","title" : "hadoop"}
}

使用_alias实现不停机重建索引

在实际场景中, 我们ES中的数据都是来自于MySQL, 当我们修改了某个索引的Mapping或Setting需要重建索引时, 我们可以使用_alias来实现不停机重建索引, 即在重建索引的过程中, 旧索引仍然对外提供服务.

(1) 定义Mapping

PUT /blogs
{"mappings": {"properties": {"content": {"type": "text"},"title": {"type": "text"}}}
}

(2) 设置别名

PUT /blogs/_alias/blogs_v1

(3) 通过别名操作索引

PUT /blogs_v1/_doc/1
{"content": "Hadoop is cool","title": "hadoop"
}GET /blogs_v1/_search

(4) 新建一个索引

我们这个时候发现原来的索引Mapping结构不太合适, 想要进行修改.

PUT /blogs_fix
{"mappings": {"properties": {"content": {"type": "text"},"title": {"type": "keyword"}}}
}

(5) 重建索引

将MySQL中对应的数据索引到Elasticsearch中, 这里使用reindex模拟这个操作.

POST _reindex
{"source": {"index": "blogs"},"dest": {"index": "blogs_fix"},"conflicts": "proceed"
}

(6) 重建索引之后再切换别名

POST /_aliases
{"actions": [{"remove": {"index": "blogs","alias": "blogs_v1"}},{"add": {"index": "blogs_fix","alias": "blogs_v1"}}]
}

(7) 通过别名操作索引

通过使用别名操作索引, 使得重建索引对外无感知, 不影响对外提供服务.

GET /blogs_v1/_search

Elasticsearch重建索引相关推荐

  1. 教你如何在 elasticsearch 中重建索引

    序言 Elasticsearch 是一个实时的分布式搜索分析引擎.Teambition 使用 Elastisearch 作为搜索引擎,为用户提供搜索服务,当我们决定存储某种数据时,我们需要使用PUT ...

  2. 【elasticsearch】ES数据库重建索引 -- Reindex(数据迁移)

    1.应用背景: 1.当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex. 2.当数据的mapping需要修改,但是大量的 ...

  3. Elasticsearch 2.3.0 重建索引

    2019独角兽企业重金招聘Python工程师标准>>> 重建索引是2.3.0新增加的接口.这个接口是实验性质的,在未来有可能会改变. 重建索引的最基本的功能是拷贝文件从一个索引到另一 ...

  4. ElasticSearch(6.8.6)-es重建索引

    ES重建索引 一.重建索引流程 1.老索引添加别名 2.创建新索引 3.copy老索引数据到新索引 4.替换别名 5.删除旧索引 二.扩展操作 建立新索引,索引名称为老索引名称 将现在的索引数据迁移到 ...

  5. Elasticsearch: 索引别名Aliases

    业务问题 业务需求是不断变化迭代的,也许我们之前写的某个业务逻辑在下个版本就变化了,我们可能需要修改原来的设计,例如数据库可能需要添加一个字段或删减一个字段,而在搜索中也会发生这件事,即使你认为现在的 ...

  6. imp 只导入索引_Elasticsearch系列---实战零停机重建索引

    前言 我们使用Elasticsearch索引文档时,最理想的情况是文档JSON结构是确定的,数据源源不断地灌进来即可,但实际情况中,没人能够阻拦需求的变更,在项目的某个版本,可能会对原有的文档结构造成 ...

  7. elasticsearch删除索引后再新建时踩的坑

    2019独角兽企业重金招聘Python工程师标准>>> 事件的过程 所有操作都在elasticsearch插件head里 1. 清空所有索引 这个删除操作和linux rm -rf ...

  8. ES数据库重建索引——Reindex(数据迁移)

    一.应用背景    ES在创建好索引后,mapping的properties属性类型是不能更改的,只能添加.如果说需要修改字段就需要重新建立索引然后把旧数据导到新索引. 1.当你的数据量过大,而你的索 ...

  9. Elasticsearch 每个索引应该有多少个分片

    原文链接:https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index 大多数Elasticsearch用户在创建索引 ...

最新文章

  1. Linux C++/Java/Web/OC Socket网络编程
  2. python读excel乱码_Python读写excel练习_去除excel中乱码行,并添加列
  3. 全国计算机一级考试理论部分,计算机一级考试理论试题:第七部分 单选
  4. css搜索框变圆脸角,CSS浮动布局
  5. Effective C++ .07 virtual析构函数的提供
  6. 使用ACME部署生成阿里云免费HTTPS证书
  7. LayoutInflater.inflate()方法两个参数和三个参数
  8. 计算机械效率的公式四种,功功率机械效率复习题超全
  9. IE6和IE7的line-height和现代浏览器不一致的问题
  10. ims应用服务器,IMS业务应用服务器部署方式分析.PDF
  11. ANT下载和配置 IDEA
  12. php 三才五格计算,姓名、名字笔划算命五格测试算命计算方法
  13. Facebook公司:如何删掉960万句“脏话”?
  14. 解决win10使用电池时自动调节亮度问题
  15. Android获取SDcard目录及创建文件夹;
  16. 如何通俗易懂地解释什么是SOA?什么是服务治理
  17. 相对定位中整周模糊度确定方法
  18. 2020第十一届蓝桥杯大赛软件类国赛 C/C++ 大学 B 组
  19. 页面加载时间过长的解决
  20. 计算机在我们的生活中应用,计算机在我们生活中的应用

热门文章

  1. Nginx+Tomcat负载均衡的部署
  2. html5页面正文内容标签,HTML5 结构标签
  3. PostGIS系列课程之空间约束(三)
  4. 电风扇维修 记录-成功复原3台电风扇
  5. 深度学习在三维点云上的应用(Deep Learning for 3D Point Clouds: A Survey)
  6. 2018阿里巴巴基础平台研发工程师实习生笔试题:一.十进制数转换成的二进制数中有几个1. 二.输出IP所在的网段
  7. Vue 实现商品详情多播图(点击图片列表轮播图)
  8. 建筑智能化资质办理要求
  9. 【iOS教程】SideLoadly自签名IPA 教程
  10. SDM、ESR、LBF、AAM