Elasticsearch重建索引
本文基于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重建索引相关推荐
- 教你如何在 elasticsearch 中重建索引
序言 Elasticsearch 是一个实时的分布式搜索分析引擎.Teambition 使用 Elastisearch 作为搜索引擎,为用户提供搜索服务,当我们决定存储某种数据时,我们需要使用PUT ...
- 【elasticsearch】ES数据库重建索引 -- Reindex(数据迁移)
1.应用背景: 1.当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex. 2.当数据的mapping需要修改,但是大量的 ...
- Elasticsearch 2.3.0 重建索引
2019独角兽企业重金招聘Python工程师标准>>> 重建索引是2.3.0新增加的接口.这个接口是实验性质的,在未来有可能会改变. 重建索引的最基本的功能是拷贝文件从一个索引到另一 ...
- ElasticSearch(6.8.6)-es重建索引
ES重建索引 一.重建索引流程 1.老索引添加别名 2.创建新索引 3.copy老索引数据到新索引 4.替换别名 5.删除旧索引 二.扩展操作 建立新索引,索引名称为老索引名称 将现在的索引数据迁移到 ...
- Elasticsearch: 索引别名Aliases
业务问题 业务需求是不断变化迭代的,也许我们之前写的某个业务逻辑在下个版本就变化了,我们可能需要修改原来的设计,例如数据库可能需要添加一个字段或删减一个字段,而在搜索中也会发生这件事,即使你认为现在的 ...
- imp 只导入索引_Elasticsearch系列---实战零停机重建索引
前言 我们使用Elasticsearch索引文档时,最理想的情况是文档JSON结构是确定的,数据源源不断地灌进来即可,但实际情况中,没人能够阻拦需求的变更,在项目的某个版本,可能会对原有的文档结构造成 ...
- elasticsearch删除索引后再新建时踩的坑
2019独角兽企业重金招聘Python工程师标准>>> 事件的过程 所有操作都在elasticsearch插件head里 1. 清空所有索引 这个删除操作和linux rm -rf ...
- ES数据库重建索引——Reindex(数据迁移)
一.应用背景 ES在创建好索引后,mapping的properties属性类型是不能更改的,只能添加.如果说需要修改字段就需要重新建立索引然后把旧数据导到新索引. 1.当你的数据量过大,而你的索 ...
- Elasticsearch 每个索引应该有多少个分片
原文链接:https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index 大多数Elasticsearch用户在创建索引 ...
最新文章
- Linux C++/Java/Web/OC Socket网络编程
- python读excel乱码_Python读写excel练习_去除excel中乱码行,并添加列
- 全国计算机一级考试理论部分,计算机一级考试理论试题:第七部分 单选
- css搜索框变圆脸角,CSS浮动布局
- Effective C++ .07 virtual析构函数的提供
- 使用ACME部署生成阿里云免费HTTPS证书
- LayoutInflater.inflate()方法两个参数和三个参数
- 计算机械效率的公式四种,功功率机械效率复习题超全
- IE6和IE7的line-height和现代浏览器不一致的问题
- ims应用服务器,IMS业务应用服务器部署方式分析.PDF
- ANT下载和配置 IDEA
- php 三才五格计算,姓名、名字笔划算命五格测试算命计算方法
- Facebook公司:如何删掉960万句“脏话”?
- 解决win10使用电池时自动调节亮度问题
- Android获取SDcard目录及创建文件夹;
- 如何通俗易懂地解释什么是SOA?什么是服务治理
- 相对定位中整周模糊度确定方法
- 2020第十一届蓝桥杯大赛软件类国赛 C/C++ 大学 B 组
- 页面加载时间过长的解决
- 计算机在我们的生活中应用,计算机在我们生活中的应用
热门文章
- Nginx+Tomcat负载均衡的部署
- html5页面正文内容标签,HTML5 结构标签
- PostGIS系列课程之空间约束(三)
- 电风扇维修 记录-成功复原3台电风扇
- 深度学习在三维点云上的应用(Deep Learning for 3D Point Clouds: A Survey)
- 2018阿里巴巴基础平台研发工程师实习生笔试题:一.十进制数转换成的二进制数中有几个1. 二.输出IP所在的网段
- Vue 实现商品详情多播图(点击图片列表轮播图)
- 建筑智能化资质办理要求
- 【iOS教程】SideLoadly自签名IPA 教程
- SDM、ESR、LBF、AAM