"scan-6ren">
gpt4 book ai didi

Elasticsearch 滚动

转载 作者:行者123 更新时间:2023-11-29 02:46:17 30 4
gpt4 key购买 nike

我对 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,它本质上做的是扫描索引以查找随扫描请求提供的查询并返回一个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(在上一个滚动请求中收到)并返回下一批结果。
  • 滚动时间基本上是搜索上下文保持事件状态的时间。如果在设置的时间范围内没有发送下一个滚动请求,则搜索上下文丢失并且不会返回结果。这就是为什么它不应该用于具有大量文档的索引的实时结果显示。

关于 Elasticsearch 滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46604207/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com