elasticsearch 弹性搜索卷轴,elasticsearch,scroll,pagination,elasticsearch,Scroll,Pagination" /> elasticsearch 弹性搜索卷轴,elasticsearch,scroll,pagination,elasticsearch,Scroll,Pagination" />

elasticsearch 弹性搜索卷轴

elasticsearch 弹性搜索卷轴,elasticsearch,scroll,pagination,elasticsearch,Scroll,Pagination,我对Elasticsearch的滚动功能有点困惑。 在elasticsearch中,用户每次滚动结果集时是否可以调用搜索API? 从文件 "search_type" => "scan", // use search_type=scan "scroll" => "30s", // how long between scroll requests. should be small! "size" => 50, // how man

我对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条记录时,我是否可以先显示第一组250条记录。请建议您对
滚动属性的用途理解错误。这并不意味着elasticsearch将在30秒后获取下一页数据。在执行第一个滚动请求时,需要指定何时关闭滚动上下文<代码>滚动
参数指示在30秒后关闭滚动上下文


在执行第一个滚动请求后,您将返回
scroll\u id
参数作为响应。对于下一页,您需要传递该值以获得滚动响应的下一页。如果您在30秒内不执行下一个滚动请求,滚动请求将被关闭,您将无法获取该滚动请求的下一页。

您所描述的示例用例实际上是,它可用于任何搜索查询,并且受10k结果的限制<代码>滚动当您需要超过10k限制时,需要请求,通过
滚动
查询,您甚至可以获取整个文档集合

这里的混淆源可能是
scroll
术语不明确:它意味着查询的类型,也是此类查询的参数名称(如中所述,ES将一直等待您获取下一个滚动块的时间到了)

滚动
查询很繁重,在绝对必要之前应避免。事实上 它说:

滚动不是用于实时用户请求,而是用于处理大量数据

关于你的另一个问题:

在elasticsearch中,用户每次滚动结果集时是否可以调用搜索API

是的,甚至好几个 有可能:

每个滚动都是独立的,可以像任何滚动请求一样并行处理


你要找的是分页

您可以通过查询固定大小并设置
from
参数来实现目标。由于您希望设置以250个结果为一批显示,因此可以设置
size=250
,并在每个连续查询中,将
的值从
增加到
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\u id
。此
scroll\u 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
在上面的示例中,发生以下事件-

  • 滚动条已初始化。这将返回第一批结果以及滚动id
  • 对于每个后续滚动请求,都会发送更新的
    滚动id
    (在上一次滚动请求中收到),并返回下一批结果
  • 滚动时间基本上是搜索上下文保持活动状态的时间。如果未在设置的时间范围内发送下一个滚动请求,则搜索上下文将丢失,结果将不会返回。这就是为什么它不应该用于对包含大量文档的索引进行实时结果显示的原因
    • 的文档也解释了这种行为

      结果大小10k是默认值,如有必要,可在运行时覆盖:

      PUT { "index" : { "max_result_window" : 500000} }
      
      滚动id的使用时间在每个滚动请求中通过参数“scroll”定义,例如


      scroll='2m'是什么意思?是指2分钟吗?它有什么用?@AmoghMishra是的,它的意思是2minutes@AmoghMishrascroll获取查询的快照,这就是它在内存中存储的时间。这意味着,如果添加/更新记录,后续的滚动将看不到它们。“search\u type=scan”已被弃用,并在v5.0中被删除。你不需要它你希望sid每次都不一样吗?我每次都得到相同的sid。问题是什么?在生成新的滚动id和上下文时,是否会自动清除上一个滚动id及其上下文,或者所有滚动id及其上下文在指定的时间到期之前保持活动状态,或者所有数据都已滚动?id将在指定的时间结束之前保持活动状态,您可以有多个滚动上下文,每个滚动上下文都有其生命周期
      ..
        "scroll" : "5m"
        ..