如果是小数据集(例如 1K 条记录),您可以简单地指定size:
curl localhost:9200/foo_index/_search?size=1000
不需要match all query,因为它是隐含的。
如果你有一个中等大小的数据集,比如 1M 条记录,你可能没有足够的内存来加载它,所以你需要一个scroll。
滚动就像数据库中的游标。在 Elasticsearch 中,它会记住您离开的位置并保持索引的相同视图(即阻止搜索者使用 refresh 离开,阻止 segments from merging)。
API 方面,您必须在第一个请求中添加滚动参数:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
你得到第一页和一个滚动 ID:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
请记住,您返回的滚动 ID 和超时都对下一页有效。这里的一个常见错误是指定一个非常大的超时(值为scroll),这将涵盖处理整个数据集(例如 1M 条记录)而不是一页(例如 100 条记录)。
要获取下一页,请填写最后一个滚动 ID 和一个超时,该超时应持续到获取下一页:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
如果您有很多要导出的内容(例如 1B 文档),您需要并行化。这可以通过sliced scroll 完成。假设您要在 10 个线程上导出。第一个线程会发出这样的请求:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
您将返回第一页和滚动 ID,这与普通滚动请求完全一样。您可以像使用普通滚动一样使用它,只是您获得了 1/10 的数据。
其他线程也会这样做,除了 id 将是 1、2、3...