我了解Elasticsearch Scroll API不适用于实时用户请求。但如果用它那会不好?我需要实现分页结果(要在Web前端显示),from
/ size
方法会在页面之间返回重复项。大概是因为我有一个分片设置(根本没有复制品)。我已经尝试设置preference
,但它没有帮助。
Scroll API似乎没有这个问题,我想知道将它用于我的用例是否真的很糟糕?
由于
答案 0 :(得分:1)
滚动搜索的结果反映了初始搜索请求时索引的状态。随后的索引编制或文档更改仅影响以后的搜索和滚动请求。这意味着您的分页基于您请求搜索结果的时间,因此您看不到新文档,或者结果中将看到已删除文档。 ES也不建议将Scroll API用于深度分页(ES 7.x)。您可以在ElasticSearch文档页面上找到更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/scroll-api.html
答案 1 :(得分:0)
关于“为什么会得到重复结果”的问题,我认为这是由中间索引造成的。当使用分页进行独立搜索调用时,每个调用都独立运行(仍然使用一些缓存)。所以如果你问前 100 名,你会得到前 100 名。当然后在 x 秒后询问“下一个” 100 时,您会在 x 秒后得到 100 - 199。如果同时索引了一个新文档,它在逻辑上适合前 100 个文档,它将进一步推动其余文档。这样,您的结果 100(第二个结果中的第一个)可能在第一次调用中是 #99。然后在 UI 中将它们粘合在一起时,您会看到两次相同的结果。 scroll 和 search-after 都旨在将 ES 引用回原始调用,表明您希望从那一刻开始继续计数。
虽然为什么 search_after 比滚动更好,但我还没有找到好的解释。
我假设滚动是针对您无论如何都要浏览整个集合的用例进行了优化(因此分页是为了避免客户端和 ES 和客户端之间的管道因太大的块而过载立刻)。虽然 search_after 针对您可能只走远/深入几页的用例进行了优化(众所周知,人类用户倾向于停留在第一页上,而且走得更远的频率会迅速降低,因为您会强迫您眼睛在海量的信息中找到一些东西)。在用户界面中实施良好的过滤器是更好的方法。