我很难找到有关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
的部分是它的documentation本身。除此之外,我找不到其他东西。我想要一些细节,例如qry:key
或qry:annotation
的意思。
我是否缺少任何文档来描述xdmp:plan
的可能输出。因为这是了解查询性能的一种非常有价值的工具,所以我希望它会被很好地记录下来。
编辑:我发现的这个marklogic blog post提供了一些有关如何解释查询计划的示例。
不过,我觉得博客文章应该不成为该工具的唯一合理的文档。
我还在想一些问题:
partial-plan
和final-plan
之间有什么区别。 final-plan
是所有partial-plans
的合并吗? partial-plan
在什么时候使用?部分计划似乎造成了限制。在索引解析阶段是否使用这些约束来查找候选片段ID? 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>
答案 0 :(得分:3)
经过更多的搜索和阅读后,我决定总结一下我的发现。
注意:如果您不使用碎片,则每次使用“碎片”都可以与“文档”相提并论。
partial-plan
只是显示了计划的增量部分,似乎主要是供参考。
full-plan
是请求,它是如何发送到索引的,因此在大多数情况下是有趣的部分。
documentation of query-trace对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>
一个未过滤查询记录了相同的消息,但没有“ to filter”指示未执行第二个过滤步骤:
xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer"), ("unfiltered")))
=> ...
<qry:info-trace>Selected 2 fragments</qry:info-trace>
<qry:result estimate="2"></qry:result>
estimate
中的qry:result
仅使用索引信息显示有多少片段与查询匹配。因此,这是过滤步骤之前的估计数,因此可能包含假阳性。我认为上述估计值和信息跟踪的对数始终相同。
启用element-word-query
且仅启用word searches
(禁用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
之外的包含“计算机”一词的文档。因此,未经过滤的搜索可能会返回假阳性。
同时启用了{strong> element-word-query
和 word searches
的{{1}}会返回此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
元素内对单词“ computer”的组合搜索。在我的情况下,该查询可能未经过滤,但仍不返回任何假阳性。
此blog post中的更多详细信息。
该title
标记表示所得到的候选片段引用正在排序。可以使用cts:order Constructors函数中的cts:search之一来控制。示例:
<qry:ordering>
我一直想知道如何查看是否使用了索引(用于查询执行计划,就像执行完整的索引扫描一样)。 最终,您可以很容易地说出是否使用索引:
搜索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"]/..)
表示步骤4以外的所有部分,<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>
可以由索引解析。根据您的查询,这可能不是一个坏兆头。在这种情况下,可以通过以下方式修改查询:
这个经过稍微修改的查询可以将索引用于所有“步骤” /..
xdmp:plan(//image[id = "1"]);
更多详细信息,请参见here。
如果有人找到有关如何解释和使用<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>
输出的更多信息,我将很高兴知道这一点。
更新2018年11月17日:
发现了这个非常有趣的video,Mary Holstege在其中谈论了MarkLogic搜索和索引。这涵盖了我的很多问题,我真的可以推荐。
答案 1 :(得分:1)
如果您在最终计划中看到一个没有注解的术语,我也要补充一点,那就是一个错误,您应该报告它。