2

我在 Marklogic 数据库中有大约 20 个 lacs 文档。我想要我的搜索应用程序中的文档总数进行分页。为了获得我正在使用的总数

xdmp:estimate(cts:search(doc(), $query))

其中 $query 是组合在 中的各种查询的组合cts:and-query。但我没有得到正确的总数。当 $query 为空白时,它显示的计数比数据库中的文档总数高得多。当我使用

xdmp:estimate(doc())

它向我显示了正确的总数,但它将是静态总数,不会根据查询而改变。我想要根据响应特定查询返回的结果的总数,这就是为什么我将 $query 作为参数传递但它没有显示正确的总数。fn:count()显示正确的总数,但是当文档数量约为 20 lacs 时,fn:count()由于fn:count()xdmp:estimate().

请帮助我获取响应用户输入的搜索词返回的正确文档总数。

4

2 回答 2

10

要了解这里发生了什么,请先阅读来自http://resources.marklogic.com/library/media/inside-marklogic的架构白皮书

现在试试这个测试用例:

xdmp:estimate(doc()),
xdmp:estimate(cts:search(doc(), ()))

第一个表达式将计算数据库中的文档数。第二个表达式将计算数据库中文档片段的数量。因此,如果结果不同,您可能配置了片段根或片段父级。一些特殊的文档也会产生额外的片段:我认为拼写词典和同义词库文档会这样做。

如果要将估计限制为 XML 文档根,请在可搜索表达式中指定文档根 QName(s),或者/*如果您不关心根元素名称,则使用。

xdmp:estimate(cts:search(/*, ()))

您还可以使用 cts:query 参数来指定仅出现在您要计算的文档中的 QName。

于 2012-05-18T15:49:56.910 回答
1

我不明白你的问题。您想要数据库中的文档总数还是与您的搜索匹配的文档总数?

xdmp:estimate是正确的方法,但它只是一个ESTIMATE。如果估计中使用的查询可以从索引中完全解决,那么估计将是 100% 正确的。但是,如果不能从索引中完全解析查询(需要过滤),那么估计值将有一定的偏差。这是因为xdmp:estimate只使用索引来给你一个计数。比较。fn:count(cts:search(doc(), $query))_ xdmp:estimate(cts:search(doc(), $query))如果给定查询的结果显着不同,那么您要么需要打开额外的索引来支持该查询,要么接受差异。

于 2012-05-18T15:11:12.793 回答