Solr 光标标记和分页

Solr cursor marker and pagination

我想在我的网站上使用 Solr 作为搜索引擎,我想了解基本分页和使用光标标记的深度分页之间的区别。

据我了解,如果您使用基本分页并以每页 20 个结果查询第 1001 页,将会发生这种情况:

我想问题出在有人点击下一页时。 Solr 将首先找到 1001*20 个结果,然后显示所需的结果。

我还没有看到一个合适的大数字深度分页的例子。只有少数,所以我不确定。有人可以澄清一下吗?

下面的例子正确吗?

.../query?q=id:book*&sort=pubyear_i+desc,id+asc&fl=title_t,pubyear_i&rows=1&cursorMark=*

这给了我 "nextCursorMark" : "AoJcfCVib29rMg=="

现在我有了 nextCursorMark,我可以去寻找我想要的页面了。 我现在应该手动浏览页面吗?我应该创建一个循环来搜索我想要的特定页面吗?

或者我是否应该让第一个查询包含 20000 行,获取 nextCursorMark,然后将其用于另一个只有 20 行的查询?

我觉得 运行 一些 20000 行的查询只是为了获得 nextCursorMark 有点奇怪。这是正确的做法吗?

如果,例如您有 10 个页面,用户想从第 1 页点击第 5 页,我是否需要手动浏览每一页才能到达那里?

编辑:

我读过这个:How to manage "paging" with Solr?

还有这个:https://lucidworks.com/blog/2013/12/12/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/

试图找到一个工作示例但找不到。

cursorMark 告诉 Solr 它应该从哪里开始下一个响应。它类似于第一个示例中的 start 参数。当您对结果进行分页时,每个响应的 cursorMark 会显示下一页的开始位置。

如果您只是在寻找 "what is the first result on page 1001",第一个版本就可以正常工作。如果您对结果进行分页 - 用户可能会或可能不会转到下一页,使用 cursorMarks 的要点是每个节点(或在单个节点设置中)知道哪个文档是最后显示的文档,因此,每个节点的当前位置只能 return rows 个文档。如果您要执行第一个版本,则每个节点都必须 return start + rows 文件。因此,您无需尝试找出 "which documents are the ten ones after 20001",只需回答 "which documents are the next ten after this sort key".

此外,cursorMarks 可以更好地处理结果集的更新,因为您可以避免对结果集进行任何更改,这些更改会将已经显示的文档推回您正在显示的下一页。

请参阅 the reference guide for complete examples 和更多说明。