我很难找到关于xdmp:plan输出的详细信息。
有这样一个简单的查询:
xdmp:plan(cts:search(doc(), cts:element-value-query(xs:QName("description"), "some text")))结果产生了相当长的执行计划:
<qry:query-plan xmlns:qry="http://marklogic.com/cts/query">
<qry:expr-trace>...</qry:expr-trace>
...
<qry:partial-plan>
<qry:term-query weight="1">
<qry:key>16037778974159125508</qry:key>
<qry:annotation>element(description,value("some","text"))</qry:annotation>
</qry:term-query>
</qry:partial-plan>
...
<qry:ordering></qry:ordering>
<qry:final-plan>
<qry:and-query>
<qry:term-query weight="1">
<qry:key>16037778974159125508</qry:key>
<qry:annotation>element(description,value("some","text"))</qry:annotation>
</qry:term-query>
</qry:and-query>
</qry:final-plan>
<qry:info-trace>Selected 0 fragments to filter</qry:info-trace>
<qry:result estimate="0"></qry:result>
</qry:query-plan>文档中提到xdmp:plan的唯一部分是它的文档本身。除此之外,我找不到别的东西了。我想要一些关于qry:key或qry:annotation真正含义的细节。
我是否缺少描述xdmp:plan可能输出的任何文档。因为为了理解查询性能,这是一个非常有价值的工具,我希望它会有很好的文档记录。
编辑:我找到的这个marklogic博客文章给出了一些如何解释查询计划的例子。
不过,我觉得这是一篇博客文章,而不是应该是这个工具的唯一合理的文档。
我还在想一些问题:
partial-plan和final-plan有什么区别?final-plan是所有partial-plans的合并吗?partial-plan是用于什么和什么时候使用的?部分计划似乎造成了限制。是否在索引解析阶段使用这些约束来查找候选片段ids?final-plan在那里扮演什么角色?final-plan是否用于在索引解析后筛选出假阳性?有时,我可以在查询计划中找到这一点:
<qry:elem-word-trace text="computer" elem-name="title" elem-uri="">
<qry:key>10975994818398622042</qry:key>
</qry:elem-word-trace>qry:elem-word-trace是什么意思?<qry:ordering></qry:ordering>呢?在我的回答中添加了一个关于排序的简单描述。/doc[id = 1]这样的简单xpath查询输出以下2次:这有什么原因吗?为什么步骤2谓词1贡献相同的partial-plan两次?
<qry:info-trace>Step 2 predicate 1 contributed 1 constraint: id = 1</qry:info-trace>
<qry:partial-plan xmlns:qry="...">...</qry:partial-plan>
<qry:info-trace>Step 2 predicate 1 contributed 1 constraint: id = 1</qry:info-trace>
<qry:partial-plan xmlns:qry="...">...</qry:partial-plan>发布于 2018-10-28 10:12:55
经过进一步的研究和阅读,我决定总结一下我的发现。
注意事项:如果您不使用碎片,则“片段”的每一种用法都可以与“文档”相同。
部分计划与全部计划
partial-plan只是在进来时显示计划的增量部分,并且似乎主要是为了信息的使用。
另一方面,full-plan是请求如何将其发送到索引,因此在大多数情况下是有趣的部分。
选定的x片段
查询跟踪文档对info-trace消息的含义提供了一些洞察:
有一个过滤的查询结果在info-trace中描述从查询处理的索引解析阶段返回了多少候选片段引用:
xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer")))
=> ...
<qry:info-trace>Selected 2 fragments to filter</qry:info-trace>未过滤的查询记录相同的消息,但没有“要筛选”,这表示没有执行第二个筛选步骤:
xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer"), ("unfiltered")))
=> ...
<qry:info-trace>Selected 2 fragments</qry:info-trace>qry:结果
<qry:result estimate="2"></qry:result>estimate in qry:result显示了单独使用索引信息匹配查询的片段数。因此,这是过滤步骤之前的估计数,因此可能包含假阳性。我认为上面描述的估计值和信息跟踪日志总是一样的。
不同的注释示例
在启用唯一的element-word-query (禁用fast element word searches)的情况下,返回此final-plan
xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer")))
=> ...
<qry:final-plan>
<qry:and-query>
<qry:term-query weight="1">
<qry:key>13967911917401594192</qry:key>
<qry:annotation>word("computer")</qry:annotation>
</qry:term-query>
<qry:term-query weight="0">
<qry:key>745773915438417736</qry:key>
<qry:annotation>element(title)</qry:annotation>
</qry:term-query>
</qry:and-query>
</qry:final-plan>对于一个word("computer")和一个element(title)有两个单独的术语查询,这意味着它还将返回包含元素title之外的单词"computer“的文档。因此,未经过滤的搜索可能会返回假阳性。
启用element-word-query和的 word searches 和 fast element word searches都会返回这个final-plan
<qry:final-plan>
<qry:and-query>
<qry:term-query weight="1">
<qry:key>10975994818398622042</qry:key>
<qry:annotation>element(title,word("computer"))</qry:annotation>
</qry:term-query>
</qry:and-query>
</qry:final-plan>在这里,annotation表示在title元素中对单词"computer“的组合搜索。在我的情况下,这个查询可以不被过滤,并且仍然不返回假阳性。
本博客帖子中有更详细的信息。
qry:订购
该<qry:ordering>标记表示正在排序生成的候选片段引用。这可以通过cts:订单构造器函数中的一个cts:搜索来控制。示例:
xdmp:plan(
cts:search(
doc(),
cts:element-word-query(xs:QName("title"), "computer"),
(cts:unordered())
))
=>....
<qry:ordering>
<qry:unordered></qry:unordered>
</qry:ordering>如何查看是否使用了索引
我一直在想,如何查看是否使用了索引(用于查询执行计划,而您需要进行完整的索引扫描)。最终,您可以很容易地判断是否使用了索引:
搜索<qry:info-trace>日志,其中包含searchable。包含searchable的消息是好的,这意味着可以使用索引执行查询的这一部分。如果它包含单词unsearchable,这可能是一个不好的迹象。
xdmp:plan(//image/id[. = "1"]/..)的日志消息可能如下所示:
<qry:info-trace>Analyzing path: fn:collection()/descendant::image/id[. = "1"]/..</qry:info-trace>
<qry:info-trace>Step 1 is searchable: fn:collection()</qry:info-trace>
<qry:info-trace>Step 2 is searchable: descendant::image</qry:info-trace>
<qry:info-trace>Step 3 is searchable: id[. = "1"]</qry:info-trace>
<qry:info-trace>Step 4 axis is unsearchable: parent</qry:info-trace>
<qry:info-trace>Step 4 is unsearchable: ..</qry:info-trace>意味着除步骤4以外的所有部分,/..可以通过索引进行解析。这可能不是一个坏迹象,取决于您的查询。在这种情况下,可以修改查询:
这个稍微修改过的查询可以对所有“步骤”xdmp:plan(//image[id = "1"]);使用索引。
<qry:info-trace>Analyzing path: fn:collection()/descendant::image[id = "1"]</qry:info-trace>
<qry:info-trace>Step 1 is searchable: fn:collection()</qry:info-trace>
<qry:info-trace>Step 2 is searchable: descendant::image[id = "1"]</qry:info-trace>
<qry:info-trace>Path is fully searchable.</qry:info-trace>更详细的信息可以找到这里。
如果有人发现了更多关于如何解释和使用xmdp:plan输出的信息,我很乐意知道它。
更新17.11.2018:
在这个非常有趣的视频中,MarkLogic谈到了MarkLogic搜索和索引。这涵盖了我的许多问题,我真的可以推荐它。
发布于 2018-10-29 14:40:02
我还想补充一下,如果您在最终计划中看到一个没有注释的术语,那就是一个bug,您应该报告它。
https://stackoverflow.com/questions/53023665
复制相似问题