1

我在 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 中是否有任何有效的分页方法(用于搜索:搜索),以便用户可以在如此大的数据库的查询结果中不延迟地转到最后一页?

4

3 回答 3

4

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

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

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

如果你这样做

于 2012-04-11T14:45:09.903 回答
0

在http://developer.marklogic.com/learn/2006-09-paginated-search有一个关于分页搜索的教程

于 2012-04-11T14:29:16.250 回答
0

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

这是另一个提示:为了更好地了解 MarkLogic 对 search:search 所做的事情,请致电

搜索:获取默认选项()

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

于 2012-04-11T17:59:13.827 回答