【发布时间】:2013-11-08 05:36:44
【问题描述】:
当我搜索文档时,我将前 10 个元素提供给视图,如果用户滚动到列表末尾,则应该显示接下来的 10 个元素。
我知道显示文档的最后一个文档 id,现在我必须获取下一个 10。基本上我会执行完全相同的搜索,偏移量为 10,但能够使用相同的搜索会好得多查询,将最后检索到的文档的文档 id 放入其中,并在具有该 id 的文档之后检索匹配的文档。
弹性搜索可以做到吗?
=== 更新
我想进一步指出我的问题,因为现在描述的似乎还不够清楚。很抱歉。
案例:
你有一种饲料,饲料每秒都会增长。如果用户访问提要,他会获得最近的 10 个条目,如果他向下滚动,他想获得接下来的 10 个条目。
由于提要每秒都在增长,因此通常的偏移量/限制(弹性搜索中的来自/大小)无法解决此问题,您将显示已显示的条目或完全更新的条目,具体取决于第一次请求之间的时间(第一次10 个条目)和下一个条目的请求。
在已经显示的条目之后获取下一个 10 个元素的请求为后端提供了显示的最后一个条目的 ID。后端知道忽略此特定条目之前的所有条目。
当我在代码中处理这个问题时,我从 Elasticsearch 请求包含所有匹配条目的列表并对其进行迭代,这样我就可以做我想做的一切(毫不奇怪)并提取所需的整体块。
我的问题是:在 elasticsearch 中是否有针对此问题的内置解决方案。因为在路上解决问题并不是最快的。
【问题讨论】:
-
我不明白其中的区别。它只是您需要添加到查询以获取下一页的附加页面部分。您可以创建一个构造,为您创建可以附加到查询的页面查询部分
-
它有所作为。将页面想象成 twitter 提要,如果用户向下滚动并准备好获取下一个元素,则可能会发生(当用户正在阅读前 10 个元素时)提要获得新条目。如果您通过简单的偏移选择接下来的 10 个元素,用户将检索他已经拥有的元素。
-
可以用布尔查询排除一些id
-
我建议使用文档索引“时间戳”,然后从 ES 中查询所有比 X 更新的项目。您可以为此使用范围过滤器。 elasticsearch.org/guide/en/elasticsearch/reference/current/…
-
@JulianHille 是的,这是一个好主意,它适用于大多数情况,谢谢。只是为了解释为什么它不能解决所有情况:提要可以按特殊条件排序,例如cmets 的数量。在这种情况下,排序不会响应创建的时间戳。但是对于我的大多数情况,您的想法很简单而且很棒。再次感谢。
标签: elasticsearch offset