Dev*_*ika 8 pagination scroll elasticsearch
我对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
Run Code Online (Sandbox Code Playgroud)
这是否意味着它将每30秒执行一次搜索并返回所有结果集,直到没有记录为止?
例如,我的ES返回总计500条记录。我从ES获得的数据是两组分别有250条记录的记录。有什么办法可以让我先显示第一组250条记录,当用户滚动时再显示第二组250条记录。
May*_*ain 13
您正在寻找的是分页。
您可以通过查询固定大小并设置from参数来实现您的目标。由于要设置成250个结果的批量显示,因此可以设置,size = 250并在每个连续查询中将fromby 的值递增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
Run Code Online (Sandbox Code Playgroud)
相反,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
Run Code Online (Sandbox Code Playgroud)
在上述示例中,发生了以下事件-
scroll_id(在上一个滚动请求中接收到)并返回下一批结果。您正在错误理解scroll财产的目的。这并不意味着elasticsearch将在30秒后获取下一页数据。在执行第一个滚动请求时,您需要指定何时关闭滚动上下文。scroll参数告诉30秒后关闭滚动上下文。
在执行第一个滚动请求后,您将返回scroll_id参数作为响应。对于下一页,您需要传递该值以获得滚动响应的下一页。如果您将在30秒内不执行下一个滚动请求,则该滚动请求将被关闭,您将无法获取该滚动请求的下一页。
您作为示例用例描述的实际上是搜索结果分页,它可用于任何搜索查询,并且受到1万个结果的限制。scroll如果您需要超过10k的限制,则需要发出请求,通过scroll查询您甚至可以获取整个文档集合。
造成混淆的原因可能是该scroll术语含糊不清:它表示查询的类型,并且也是此类查询的参数名称(如其他注释中所述,现在ES会一直等您获取下一个滚动块)。
scroll查询比较繁琐,应避免使用,直到绝对必要为止。实际上,在文档中
它说:
滚动不用于实时用户请求,而是用于处理大量数据,...
现在关于另一个问题:
在Elasticsearch中,是否每当用户滚动结果集时都可以调用搜索API?
是的,甚至 可能有几个并行滚动请求:
每个滚动都是独立的,可以像任何滚动请求一样并行处理。
| 归档时间: |
|
| 查看次数: |
15419 次 |
| 最近记录: |