Nếu đó là một tập dữ liệu nhỏ (ví dụ: bản ghi 1K) , bạn chỉ cần chỉ định size
:
curl localhost:9200/foo_index/_search?size=1000
Tất cả các truy vấn không cần thiết, vì nó ẩn.
Nếu bạn có bộ dữ liệu cỡ trung bình, như các bản ghi 1M , bạn có thể không có đủ bộ nhớ để tải nó, vì vậy bạn cần một cuộn .
Một cuộn giống như một con trỏ trong DB. Trong Elaticsearch, nó ghi nhớ nơi bạn rời đi và giữ cùng một chế độ xem chỉ mục (nghĩa là ngăn người tìm kiếm đi xa với làm mới , ngăn các phân đoạn hợp nhất ).
API-khôn ngoan, bạn phải thêm một tham số cuộn cho yêu cầu đầu tiên:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
Bạn lấy lại trang đầu tiên và ID cuộn:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
Nhớ lấy cả ID cuộn bạn nhận được và thời gian chờ đều hợp lệ cho trang tiếp theo . Một lỗi phổ biến ở đây là chỉ định thời gian chờ rất lớn (giá trị củascroll
), sẽ bao gồm để xử lý toàn bộ tập dữ liệu (ví dụ: bản ghi 1M) thay vì một trang (ví dụ 100 bản ghi).
Để có trang tiếp theo, hãy điền ID cuộn cuối cùng và thời gian chờ sẽ kéo dài cho đến khi tìm nạp trang sau:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
Nếu bạn có nhiều thứ để xuất (ví dụ: tài liệu 1B) , bạn sẽ muốn song song. Điều này có thể được thực hiện thông qua cuộn cắt lát . Nói rằng bạn muốn xuất trên 10 chủ đề. Chuỗi đầu tiên sẽ đưa ra một yêu cầu như thế này:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
Bạn lấy lại trang đầu tiên và ID cuộn, giống hệt như yêu cầu cuộn thông thường. Bạn sẽ sử dụng chính xác như một cuộn thông thường, ngoại trừ việc bạn nhận được 1/10 dữ liệu.
Các chủ đề khác sẽ làm tương tự, ngoại trừ đó id
sẽ là 1, 2, 3 ...