【问题标题】:Pagination in Marklogic while using Search API使用搜索 API 时 Marklogic 中的分页
【发布时间】:2012-04-11 10:15:27
【问题描述】:

我在 MarkLogic 服务器中有大约 53,00,000 个文档,我正在构建一个简单的搜索应用程序。用户输入一个搜索词,MarkLogic 服务器在所有文档的所有节点中搜索该词并返回匹配的文档作为结果。我已经实现了一个自定义分页来显示每页的结果。我每页显示 10 个结果。

我为此使用搜索 api:-

import module namespace search="http://marklogic.com/appservices/search" at "/Marklogic/appservices/search/search.xqy";

declare variable $options:=

<options xmlns="http://marklogic.com/appservices/search">

    <transform-results apply="raw"/>

</options>;

search:search($p, $options, $noRecFrom, 10)/search:result

其中 $p 是来自用户的输入 $noRecFrom 是指示我们必须从哪里显示记录的数字。例如,对于第 1 页,$noRecFrom 将为 1,对于第 2 页,$noRecFrom 将为 11,对于第 3 页,$noRecFrom 将为 21,依此类推。对于分页,有超链接可以转到第一页、下一页、上一页和最后一页。

要计算我正在使用的返回记录总数:-

for $x in search:search($p, $options)

return $x//@total;

虽然 First、Next 和 Prev 超链接运行良好,但如果有人单击 Last,应用程序将停止响应,并且查询不会显示任何输出。是因为数据库中的文档太多还是我执行错误。

在 MarkLogic 中是否有任何有效的分页方式(用于搜索:搜索),以便用户可以在如此大的数据库的查询结果中不延迟地转到最后一页?

【问题讨论】:

  • 我怀疑您的计算存在缺陷,仅限于 First、Next、Prev 和 Last。但是您必须与我们分享以确保。您可能会意外地请求大量搜索结果以返回最后一页,这可以解释为什么它响应缓慢。

标签: search pagination marklogic


【解决方案1】:

按照您实现它的方式,您在 for 循环中重复运行搜索。这确实会很慢。

相反,您应该根据@total 和每页文档数计算 $start 参数,并将其作为参数(我认为是第三个)传递给 search:search。

我还建议确保您可以在未过滤模式下运行。开发者网站上有关于优化快速分页(索引等)的好信息;这个想法是解决索引中的查询,以提供非常好的、准确的未过滤性能。

如果你这样做

【讨论】:

  • 不确定是否重复搜索,但我同意使用 for 循环获取总数似乎没有意义。
【解决方案2】:

【讨论】:

  • 请注意,2006 教程不使用高级别的search:search API。它使用较低级别的cts:search API。大多数新应用程序都可以使用更高级别的 API。
【解决方案3】:

一旦你解决了上面 cwhit 提到的问题,如果你仍然想以更快的方式到达最后一页数据,你可以让你的代码足够聪明,以反转排序顺序并拉取正确的记录偏移量.

这是另一个提示: 要更好地了解 MarkLogic 对 search:search 所做的工作,请调用

搜索:get-default-options()

查看常见搜索应用程序的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多