问题描述
我正在尝试使用Scroll API从Kibana日志中提取10万条记录。默认大小设置为500,我无权更改。我尝试使用以下命令滚动:
curl -XPOST "http://elasticsearch.us-central1.gcp.cloud.internal/shared/_search?scroll=1m&size=500&pretty" -H "Content-Type: application/json" -d '{
"_source": ["message"],"query": {
"match_phrase": {
"kubernetes.container_name": {
"query": "my-container-name"
}
}
}
}'
输出看起来像这样:
{
"scroll_id": DnF1ZXJ5VGhlbkZldGNo5TkAA.... //300,000 characters long
"took" : 16626,"timed_out" : false,"_shards" : {
"total" : 7397,"successful" : 7397,"skipped" : 0,"Failed" : 0
},"hits" : {
.....
由于滚动ID太长,我无法将其传递给Scroll API来获取下一批结果。我该如何解决?是因为分片数量大吗,有什么办法限制分片数量吗?
解决方法
基于discussion on ES Community,scroll_id的长度与索引中的分片数量之间似乎存在直接关系。
建议在请求正文中传递scroll_id。例如:
POST /_search/scroll
{
"scroll" : "1m","scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
有什么方法可以限制分片的数量吗?
- 您可以创建更少碎片的新索引
- 然后使用ReIndex API将数据重新索引到新索引
- 无法减少现有索引的分片数量。