找不到xdmp:plan结果文档

时间:2018-10-27 15:50:54

标签: marklogic marklogic-9

我很难找到有关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:keyqry:annotation的意思。

我是否缺少任何文档来描述xdmp:plan的可能输出。因为这是了解查询性能的一种非常有价值的工具,所以我希望它会被很好地记录下来。


编辑:我发现的这个marklogic blog post提供了一些有关如何解释查询计划的示例。

不过,我觉得博客文章应该成为该工具的唯一合理的文档

我还在想一些问题:

  • partial-planfinal-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>

2 个答案:

答案 0 :(得分:3)

经过更多的搜索和阅读后,我决定总结一下我的发现。

注意:如果您不使用碎片,则每次使用“碎片”都可以与“文档”相提并论。

部分计划与全面计划

partial-plan只是显示了计划的增量部分,似乎主要是供参考。

full-plan是请求,它是如何发送到索引的,因此在大多数情况下是有趣的部分。

选定的x个片段

documentation of query-traceinfo-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:结果

<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中的更多详细信息。


qry:订购

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)

如果您在最终计划中看到一个没有注解的术语,我也要补充一点,那就是一个错误,您应该报告它。