我对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
(在先前的滚动请求中接收到)并返回下一批结果。问题内容: 我在Elastic Search中遇到了滚动功能,这看起来很有趣。我浏览了许多文档,但对我而言仍然不清楚以下问题。 如果偏移量已经存在,那么为什么要使用滚动? 那即将到来的记录呢?假设它完成了所有数据的滚动,然后几秒钟后新数据进入了索引,那么它将如何工作?它还会滚动以获取新记录,例如流媒体吗? 假设由于服务器负载或Internet问题导致连接断开,那么它将从头开始滚动数据吗? 所有这些
问题内容: 我想从索引中获取所有数据。由于项数太大而无法存储,因此我使用了Scroll(很好的功能): 调用时效果很好: 但是,当我多次调用前一个方法时,会得到相同的多次,因此无法并行滚动多次。 我找到了http://elasticsearch-users.115913.n3.nabble.com/Multiple-scrolls- simultanious-td4024191.html ,其中指
问题内容: 滚动搜索可以设置的最大滚动时间是多少? 文档:https : //www.elastic.co/guide/zh- CN/elasticsearch/client/javascript-api/current/api-reference.html#api- scroll 问题答案: 没有最大滚动时间的所有值。 扫描和滚动旨在以块的形式扫描大量记录。每个块的最大值必须通过增量增加来获得,
问题内容: 我正在将其用作搜索的一部分,但必须使用+30000个项。 问题在于,搜索的初始部分是在搜索之前完成的,因此触发和功能将继续进行。我应该怎么做才能阻止这种情况? 问题答案: 所以,我已经重新编写了它,以便在这里帮助任何需要它的人。
问题内容: 我定义了以下滚动索引: 今天效果很好,它收集了我所有 现有的 每月滚动指标。问题在于,当索引滚动到新的月份时,它会自动生成的新索引,但是我的别名无法获取该新索引。每个月我需要通过运行以下命令来更新别名: 有什么方法可以让ES自动选择? 问题答案: 是的,您可以使用模板。 空对象是必然的邪恶,因为JSON期望。 每当创建匹配索引(基于参数)时,它将自动将模板应用到该索引。在这种情况下,模
问题内容: 所以首先我运行以下命令: 这将返回一个滚动ID,然后在第一个滚动请求中使用该滚动ID: 该文档会使我相信,当我运行第二个curl请求时,我应该获得一个新的滚动ID。 但是,看起来我一直在返回相同的滚动ID。 看起来每个请求返回的数据都不同,因此我假设一切正常。 到底是怎么回事? 问题答案: 您上面的内容是正确的。 在后续滚动请求中,scroll_id可以相同或可以不同。但是结果集(命中