我对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条记录。
您正在寻找的是分页。
您可以通过查询固定大小并设置from
参数来实现您的目标。既然你要设定显示在250个搜索结果批次,您可以设置size = 250
与每个连续的查询,增加值from
的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
相反,Scan & scroll
通过一次搜索,您可以检索大量结果,并且理想地用于诸如将数据重新索引到新索引之类的操作。不建议将其用于实时显示搜索结果。
Scan & scroll
简要地解释一下,它的主要作用是扫描与扫描请求一起提供的查询的索引并返回a 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
在以上示例中,发生了以下事件-
scroll_id
(在上一个滚动请求中接收到),并返回下一批结果。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句