??? ??? ???????????????(一个人不论赋有什么样的棋,他如果不知道自己有这种棋,并且不形成适合于自己棋的计划,那种棋对他便完全无用。——休漠) ??? ??? ????????? ElasticSearch 常用api
ElasticSearch 版本说明
{ “name”: “node-3”, “cluster_name”: “test-elasticsearch”, “cluster_uuid”: “FM6vTooBTS6cSM9scMEU7g”, “version”: { “number”: “2.4.1”, “build_hash”: “c67dc32e24162035d18d6fe1e952c4cbcbe79d16”, “build_timestamp”: “2016-09-27T18:57:55Z”, “build_snapshot”: false, “lucene_version”: “5.5.2” }, “tagline”: “You Know, for Search” }
ElasticSearch 数据迁移方案
ElasticSearch 数据迁移方式
有以下三种方式可以更新索引结构映射和设置
-
更新索引结构设置 因为自定义字段的key是未知的,无法显示的设置在mappings中。所以可以在settings中设置默认的分词器和过滤器等配置 -
更新索引结构映射 因为非自定义字段的key是已知的,可以显示的设置在mappings中 -
索引重建 避免影响旧索引数据,方便回滚,可以通过此方式安全的迁移数据到新索引,业务再使用该新索引即可 es默认滚动批次requests_per_second为1000
更新索引结构设置的数据迁移
优点:不需要数据迁移,直接更新索引设置就可以完成更新 缺点:只能对未设置过的字段进行更新,一次性操作,风险高。如果设置后数据检索等出了问题,就不能回滚了
操作步骤
- 先查看目前的索引结构
- 请求示例:GET http://172.21.0.31:9900/business
- 然后通过ElasticSearch接口_close关闭索引
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.0/indices-close.html#close-index-api-request
- 请求示例:http://172.21.0.31:9900/business/_close
- 再通过PUT接口更新settings
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.0/indices-update-settings.html
- 请求示例:http://172.21.0.31:9900/business/_settings
- 需要注意的是只能对未设置过的字段进行更新,当以上请求发出后,再次更新会抛错,提示无法更新
- 更新完成后,再通过接口启用该索引
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.0/indices-open-close.html
- 请求示例:http://172.21.0.31:9900/business/_open
- 重新查看该索引结构,查看更新后的结构
- 请求示例:GET http://172.21.0.31:9900/business
更新索引映射的数据迁移
- 同以上步骤相同,只不过更新是mappings
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.11/indices-put-mapping.html
重建索引_reindex,通过ElasticSearch提供的api _reindex接口进行索引数据迁移
优点:不影响旧索引数据,使用新的索引结构,即便出问题,也能够快速回滚到旧索引上 缺点:因为要迁移数据,操作较为麻烦。如果不删除旧数据索引,会额外的占用磁盘空间。业务需要使用新索引,可能需要做代码兼容
操作步骤
- 先创建新的索引结构
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/indices-create-index.html
- 请求示例 POST http://172.21.0.31:9900/business_bak
- 查看刚刚创建的新索引
- 请求示例GET http://172.21.0.31:9900/business_bak
- 需要注意numeric_detection数字转换和date_detection日期转换 ,在es中numeric_detection默认是false,但date_detection默认是开启的,所以我们需要显示的关闭date_detection选项,避免后面因为数据格式不一致导致迁移失败
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html#_customizing_detected_date_formats
- 查看新索引中的数据,因为是刚新建的索引,所以数据是空的
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.0/search-search.html
- 请求示例:GET http://172.21.0.31:9900/business_bak/_search
- 使用_reindex接口将索引business的索引数据复制至business_bak
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.9/docs-reindex.html
- 请求示例:POST http://172.21.0.31:9900/_reindex
- 再次查看新索引中的数据,已经和旧索引中的一摸一样了
- 当数据量比较大时,可以使用wait_for_completion=false,指定创建异步任务,请求成功后,es会返回一个任务编号,用于后续查看和取消
- 以测试数据举例
- 请求示例:POST http://172.21.0.31:9900/_reindex?wait_for_completion=false
- 通过接口查看该任务的状态
- 请求示例:GET http://172.21.0.31:9900/_tasks/OfyS4qUGTW2OuA2BL5fYgQ:36133906
- 若数据复制任务发生异常等情况,可以使用_cancel取消
- 请求示例:POST http://172.21.0.31:9900/_tasks/OfyS4qUGTW2OuA2BL5fYgQ:36133906/_cancel
- 再次查看,任务已经消失了
|