为什么这个ElasticSearch的扫描和滚动会不断返回相同的滚动ID?

29

首先我运行了以下命令:

curl -s -XGET http://localhost:9200/my_index/_search?scroll=1m&search_type=scan&size=10

这将返回一个滚动ID,我随后在第一个滚动请求中使用它:

curl -s -XGET http://localhost:9200/_search/scroll?scroll=1m&scroll_id=<scroll_id from above>
文档让我相信,当我运行第二个curl请求时,应该会得到一个新的scroll id。然而,看起来我一直得到相同的scroll id。由于每个请求返回的数据都不同,我认为一切正常。那是怎么回事呢?

我这边也遇到了同样的问题...每次都是相同的滚动ID,而且在分页时所有页面上都能看到相同的结果...有没有办法让每个页面都得到正确且不同的结果呢? - Jinesh Jain
2个回答

23

你上面的内容是正确的。

在后续的滚动请求中,滚动ID可能会保持不变,也可能会改变。但结果集(hits)在每次滚动调用中都肯定不同。

在多个调用过程中,滚动ID可能会发生变化,因此需要始终将最新的滚动ID作为后续请求的滚动ID传递。


1
但是原因是什么?他们是如何滚动的?当他们返回新的时候? - DaTval
6
我也对这种行为感到困惑。如果不返回不同的scroll_id,就无法支持失败后的重试。我认为scroll_id应该始终发生变化,如果你用相同的scroll id调用两次,你应该会收到相同的页面,因为这被认为是一个失败调用的重试。 - carrino
确实有些令人困惑。更好的方法是在响应中包含下一个滚动请求的链接,就像HATEOAS中一样。 - Gavin
2
我这边也遇到了同样的问题...每次都是相同的滚动ID,而且在分页时所有页面上都能看到相同的结果...有没有办法让每个页面都得到正确且不同的结果呢? - Jinesh Jain
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html - Christophe Roussy

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接