一尘不染

Elasticsearch滚动

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

这是否意味着它将每30秒执行一次搜索并返回所有结果集,直到没有记录为止?

例如,我的ES总共返回500条记录。我从ES获得的数据是两组分别有250条记录的记录。有什么办法可以让我先显示第一组250条记录,当用户滚动时再显示第二组250条记录。


阅读 208

收藏
2020-06-22

共1个答案

一尘不染

您正在寻找的是分页。

您可以通过查询固定大小并设置from参数来实现您的目标。既然你要设定显示在250个搜索结果批次,您可以设置size = 250与每个连续的查询,增加值from250

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
  • 对于每个后续滚动请求,将发送更新的scroll_id(在先前的滚动请求中接收到)并返回下一批结果。
  • 滚动时间基本上是使搜索上下文保持活动状态的时间。如果未在设置的时间范围内发送下一个滚动请求,则搜索上下文将丢失并且结果将不会返回。这就是为什么不应将其用于包含大量文档的索引的实时结果显示的原因。
2020-06-22