我对 Elasticsearch 的滚动功能有点困惑。在 elasticsearch 中,每当用户在结果集上滚动时,是否可以每次调用搜索 API?来自文档
"search_type" => "scan", // use search_type=scan
"scroll" => "30s", // how long between scroll requests. should be small!
"size" => 50, // how many results *per shard* you want back
是不是每30秒搜索一次,返回所有结果集,直到没有记录为止?
例如,我的 ES 总共返回 500 条记录。我从 ES 获取数据作为两组记录,每组有 250 条记录。有什么办法可以先显示第一组 250 条记录,当用户滚动时再显示第二组 250 条记录。请建议
您正在寻找的是分页。
您可以通过查询固定大小并设置 từ
参数来实现您的目标。因为你想设置成批显示 250 个结果,你可以设置 size = 250
并且对于每个连续的查询,将 từ
的值增加 250
.
GET /_search?size=250 ---- return first 250 results
GET /_search?size=250&from=250 ---- next 250 results
GET /_search?size=250&from=500 ---- next 250 results
ngược lại,Scan & scroll
允许您通过一次搜索检索大量结果,非常适用于将数据重新索引到新索引等操作。不建议使用它来实时显示搜索结果。
简单解释一下Scan & scroll
,它本质上做的是扫描索引以查找随扫描请求提供的查询并返回一个scroll_id
。此 scroll_id
可以传递给下一个滚动请求以返回下一批结果。
考虑下面的例子-
# Initialize the scroll
page = es.search(
index = 'yourIndex',
doc_type = 'yourType',
scroll = '2m',
search_type = 'scan',
size = 1000,
body = {
# Your query's body
}
)
sid = page['_scroll_id']
scroll_size = page['hits']['total']
# Start scrolling
while (scroll_size > 0):
print "Scrolling..."
page = es.scroll(scroll_id = sid, scroll = '2m')
# Update the scroll ID
sid = page['_scroll_id']
# Get the number of results that we returned in the last scroll
scroll_size = len(page['hits']['hits'])
print "scroll size: " + str(scroll_size)
# Do something with the obtained page
在上面的例子中,发生了以下事件-
- Scroller 已初始化。这将返回第一批结果以及 scroll_id
- 对于每个后续滚动请求,将发送更新后的
scroll_id
(在上一个滚动请求中收到)并返回下一批结果。
- 滚动时间基本上是搜索上下文保持事件状态的时间。如果在设置的时间范围内没有发送下一个滚动请求,则搜索上下文丢失并且不会返回结果。这就是为什么它不应该用于具有大量文档的索引的实时结果显示。
Tôi là một lập trình viên xuất sắc, rất giỏi!