0

我正在使用 MarkLogic 来查询相对较大的 xml 数据集。现在我正在使用两组这样的查询:

  1. xdmp:estimate(cts:search(fn:doc(), cts:and-query(($query, $text-query, $sent-query))))

  2. xdmp:estimate(cts:search(fn:doc(), cts:and-not-query(cts:and-query(($query, $text-query)), $sent-query)))

其中, $text-query := cts:word-query("coke")

$sent-query := cts:and-query((cts:element-range-query(xs:QName("score_id"),">=",$lowValue), cts:element-range-query(xs:QName ("score_id"),"<",$hiValue)))

$query := cts:word-query("健怡可乐")

$lowValue := 13264683002210000000;

$hiValue := 13264683002211000000;

对于这两个集合(查询号 1 和 2),我得到了一些计数,但是当我删除xdmp:estimate部分时,cts:search()查询1.正在返回 xmls,其中查询号。2,我得到一个空序列。

我的问题是,如果cts:search没有返回任何 xml,那么如何xdmp:estimate计算查询号的节点。2 ??

cts:and-not-query不是不舒服cts:element-range-query,虽然???

注意我得到了一些计数,xdmp:estimate没有任何错误。范围索引是在字段“ score_id ”上创建的。

4

3 回答 3

2

尝试将unfiltered选项添加到cts:search调用中。

http://docs.marklogic.com/5.0doc/docapp.xqy#display.xqy?fname=http://pubs/5.0doc/apidoc/SearchBuiltins.xml&category=SearchBuiltins&function=cts:search

有可能cts:search返回空,因为片段与索引匹配但被过滤为误报。未经过滤的结果应该可以帮助您确定这是否正确,或者可能是错误的证据。

于 2012-08-21T16:37:51.407 回答
2

特别是,“估计”将仅使用索引。如果您没有“快速短语”索引,则无法直接从索引中判断“健怡可乐”是否在文档中——它将改为使用查询的“索引解析”阶段中的索引来查找所有带有“饮食”和“可乐”的文件。稍后对于真正的查询,它将“过滤”这些候选文档,以查看这两个词是否实际上彼此相邻。

请参阅 MarkLogic 搜索开发人员指南,特别注意“索引解析”和“过滤”。

于 2012-08-22T05:00:13.407 回答
1

问题可能来自于xdmp:estimate它显示了可能有命中的片段数量(也有误报),而不仅仅是实际有。

尝试使用fn:count代替,xdmp:estimate因为它每次都会产生正确的结果,唯一的问题是它比xdmp:estimate

有关详细信息: MarkLogic Server:搜索开发人员指南第 11 章

于 2012-08-21T17:44:45.990 回答