ElasticSearch 7.10如何并行批量获取排序文档?类Oracle DBMS_PARALLEL_EXECUTE
Elasticsearch 7.10.2 并行批量获取3000万条数据方案咨询
背景与需求
- 正在测试Elasticsearch 7.10.2的PIT(Point in Time)+
search_after功能,需从ES中提取3000万条数据,每页设置为10万条 - 当前单页获取耗时:VPN环境约1.5分钟,远程机器约30秒,速度过慢,需要实现并行获取
- 参考Oracle的实现:借助
DBMS_PARALLEL_EXECUTE.run_task和DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_NUMBER_COL工具,按数字类型带索引的ID列分片,并行度设为20时,1分钟内可获取约3000万行数据,希望了解ES是否有原生类似的分片并行批量获取能力
当前遇到的问题
search_after依赖排序顺序,必须获取前一页的排序值才能发起下一页请求,无法并行执行分片任务- ES中无可用作分片依据的数字型索引ID列:仅有的FIELD1(同时作为
_id)是由15位数字组成的字符串,但该字段不是keyword类型,且无法修改索引定义,不能基于它进行排序 - 无法对
_id(字符串类型)和FIELD1(非keyword类型)执行max/min聚合,即便二者可按数字顺序排序,也无法获取范围分片的起止点,无法基于_id做范围分片查询
当前使用的查询语句
首次查询:
{ "query": { "wildcard": { "companyId": { "value": "40*" } } }, "fields":[ "FIELD1", "FIELD2" ], "sort": {"_id": "asc"}, "size": 100000, "_source": false, "pit": { "id": "<a very long id>", "keep_alive": "1m" }, "track_total_hits": false }
第2至n次查询会添加以下参数:
"search_after": ["<last hit value of FIELD1 from previous page>"]
内容的提问来源于stack exchange,提问作者WesternGun
相关产品推荐
相关产品推荐

