我在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()
慢。
请帮助我根据用户输入的搜索字词获取正确的文件总数。
答案 0 :(得分:10)
要了解这里发生了什么,请先阅读http://resources.marklogic.com/library/media/inside-marklogic
中的架构白皮书现在试试这个测试用例:
xdmp:estimate(doc()),
xdmp:estimate(cts:search(doc(), ()))
第一个表达式将计算数据库中文档的数量。第二个表达式将计算数据库中文档片段的数量。因此,如果结果不同,您可能已经配置了片段根或片段父。一些特殊文档也会创建额外的片段:我认为拼写词典和同义词库文件可以做到这一点。
如果要将估算限制为XML文档根,请在可搜索表达式中指定文档根QName,如果不关心根元素名称,请使用/*
。
xdmp:estimate(cts:search(/*, ()))
您还可以使用cts:query参数指定仅出现在要计算的文档中的QName。
答案 1 :(得分:1)
我不明白你的问题。您想要数据库中的文档总数还是与搜索匹配的文档总数?
xdmp:estimate
是正确的方法,但它只是 ESTIMATE 。如果可以从索引中完全解析估计中使用的查询,那么估计将是100%正确的。但是,如果无法从索引中完全解析查询(需要过滤),那么估计将会减少一些量。这是因为xdmp:estimate
仅使用索引来计算。将fn:count(cts:search(doc(), $query))
与xdmp:estimate(cts:search(doc(), $query))
进行比较。如果给定查询的结果明显不同,那么您需要启用其他索引来支持该查询,或者使用差异。