环境: 阿里云ElasticSearch6.7
情景: ElasticSearch的索引mapping由于不满足生产需求,需要重建mapping
例如:将字段dt 的数据类型由 keyword 改成 long 类型
实现方法:
- 原索引mapping
PUT /ads_lading_trade_detail_es?pretty
{
"settings": {
"index": {
"number_of_shards": "6",
"blocks": {
"read_only_allow_delete": "false"
},
"analysis": {
"normalizer": {
"my_normalizer": {
"filter": [
"lowercase",
"asciifolding"
],
"type": "custom",
"char_filter": []
}
}
},
"number_of_replicas": "0"
}
},
"mappings": {
"_doc": {
"properties": {
"trade_id": {
"type": "keyword"
},
"by_date": {
"type": "date"
},
"importer_clean_name": {
"fielddata": true,
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"importer_id": {
"type": "long"
},
"importer_connect_id": {
"type": "long"
},
"is_importer_logistics": {
"type": "keyword"
},
"exporter_clean_name": {
"fielddata": true,
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"exporter_id": {
"type": "long"
},
"exporter_connect_id": {
"type": "long"
},
"is_exporter_logistics": {
"type": "keyword"
},
"hscode": {
"fielddata": true,
"type": "text",
"fields": {
"keyword": {
"normalizer": "my_normalizer",
"ignore_above": 20,
"type": "keyword"
}
}
},
"prod_desc": {
"analyzer": "english",
"type": "text"
},
"exporter_country": {
"type": "keyword"
},
"exporter_province": {
"type": "keyword"
},
"exporter_city": {
"type": "keyword"
},
"exporter_district": {
"type": "keyword"
},
"is_china_exporter": {
"type": "integer"
},
"product_unit_vl_ot": {
"type": "double"
},
"product_unit_vl": {
"type": "double"
},
"product_vl_ot": {
"type": "double"
},
"product_vl": {
"type": "double"
},
"country": {
"type": "keyword"
},
"dt": {
"type": "keyword"
}
}
}
}
}
- 建立字段类型修改后的索引
PUT /ads_lading_trade_detail_es_v2?pretty
{
"settings": {
"index": {
"number_of_shards": "6",
"blocks": {
"read_only_allow_delete": "false"
},
"analysis": {
"normalizer": {
"my_normalizer": {
"filter": [
"lowercase",
"asciifolding"
],
"type": "custom",
"char_filter": []
}
}
},
"number_of_replicas": "0"
}
},
"mappings": {
"_doc": {
"properties": {
"trade_id": {
"type": "keyword"
},
"by_date": {
"type": "date"
},
"importer_clean_name": {
"fielddata": true,
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"importer_id": {
"type": "long"
},
"importer_connect_id": {
"type": "long"
},
"is_importer_logistics": {
"type": "keyword"
},
"exporter_clean_name": {
"fielddata": true,
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"exporter_id": {
"type": "long"
},
"exporter_connect_id": {
"type": "long"
},
"is_exporter_logistics": {
"type": "keyword"
},
"hscode": {
"fielddata": true,
"type": "text",
"fields": {
"keyword": {
"normalizer": "my_normalizer",
"ignore_above": 20,
"type": "keyword"
}
}
},
"prod_desc": {
"analyzer": "english",
"type": "text"
},
"exporter_country": {
"type": "keyword"
},
"exporter_province": {
"type": "keyword"
},
"exporter_city": {
"type": "keyword"
},
"exporter_district": {
"type": "keyword"
},
"is_china_exporter": {
"type": "integer"
},
"product_unit_vl_ot": {
"type": "double"
},
"product_unit_vl": {
"type": "double"
},
"product_vl_ot": {
"type": "double"
},
"product_vl": {
"type": "double"
},
"country": {
"type": "keyword"
},
"dt": {
"type": "long"
}
}
}
}
}
- 将老数据迁移至新数据
POST _reindex
{
"source": {
"index": "ads_lading_trade_detail_es"
},
"dest": {
"index": "ads_lading_trade_detail_es_v2"
}
}
- 同时我们可以对Reindex执行过程做一些限制操作
Reindex是一个时间点的副本
就像上面返回的结果显示的那样,它是以batch(批量)的方式来执行的。默认的批量大小为1000
你也可以只拷贝源index其中的一部分数据
通过加入query到source中
通过定义max_docs参数
比如:
POST _reindex
{
"max_docs": 100,
"source": {
"index": "ads_lading_trade_detail_es",
"query": {
"match": {...}
}
},
"dest": {
"index": "ads_lading_trade_detail_es_v2"
}
}
Throttling
重新索引大量文档可能会使您的群集泛滥甚至崩溃。requests_per_second限制索引操作速率。
POST _reindex?requests_per_second=500
{
"source": {
"index": "ads_lading_trade_detail_es",
"size": 500
},
"dest": {
"index": "ads_lading_trade_detail_es_v2"
}
}
参考文献:
【1】、https://www.cnblogs.com/sanduzxcvbnm/p/12084714.html
【2】、https://www.elastic.co/guide/en/elasticsearch/reference/6.7/docs-reindex.html
寄语:分享是一种乐趣,你知道的越多,你知道的越少。