无法找到xdmp:plan结果文档

问题描述 投票:5回答:2

我很难找到有关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>
marklogic marklogic-9
2个回答
3
投票

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

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

Partial vs Full-Plan

partial-plan只显示计划的增量部分,并且似乎主要仅供信息使用。

另一方面,full-plan是如何将它发送到索引的请求,因此大部分时间都是有趣的部分。

Selected x fragments

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> 描述从查询处理的索引解析阶段返回的候选片段引用数:

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>

qry:result

estimate

qry:result中的element-word-query仅使用索引信息显示有多少片段与查询匹配。因此,这是过滤步骤之前的估计数字,因此可能包含误报。我认为上面描述的估计值和信息跟踪日志总是一样的。


different annotation examples

有启用唯一的word searchesfast 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进行两个单独的term-queries意味着它还将返回包含元素element-word-query之外的单词“computer”的文档。因此,未经过滤的搜索可能会返回误报。

有一个word searchesfast element word searchesfinal-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表示在blog post元素内组合搜索单词“computer”。这个查询可能是未经过滤的,在我的情况下仍然没有返回误报。

更多详细信息在这个<qry:ordering>


qry:ordering

cts:order Constructors标记表示生成的候选片段引用正在排序。这可以用cts:search函数中的一个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>

How to see, if a index is used

我总是想知道,如何查看是否使用了索引(用于查询执行计划,您需要完整的索引扫描)。最终,如果使用或不使用索引,您可以很容易地说出来:

搜索包含searchablesearchable日志。包含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> 的索引

here

进一步的细节可以找到xmdp:plan


如果有人发现有关如何解释和使用video输出的更多信息,我很乐意了解它。

更新17.11.2018:

发现这个非常有趣的qazxswpoi,其中Mary Holstege谈论MarkLogic搜索和索引。这涵盖了我的很多问题,我真的可以推荐它。


1
投票

我还要补充一点,如果你在最终计划中看到一个没有注释的术语,那就是一个bug,你应该报告它。

© www.soinside.com 2019 - 2024. All rights reserved.