首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到xdmp:计划结果文档

找不到xdmp:计划结果文档
EN

Stack Overflow用户
提问于 2018-10-27 15:50:54
回答 2查看 137关注 0票数 6

我很难找到关于xdmp:plan输出的详细信息。

有这样一个简单的查询:

代码语言:javascript
复制
xdmp:plan(cts:search(doc(), cts:element-value-query(xs:QName("description"), "some text")))

结果产生了相当长的执行计划:

代码语言:javascript
复制
<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:keyqry:annotation真正含义的细节。

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

编辑:我找到的这个marklogic博客文章给出了一些如何解释查询计划的例子。

不过,我觉得这是一篇博客文章,而不是应该是这个工具的唯一合理的文档

我还在想一些问题:

  • partial-planfinal-plan有什么区别?final-plan是所有partial-plans的合并吗?partial-plan是用于什么和什么时候使用的?部分计划似乎造成了限制。是否在索引解析阶段使用这些约束来查找候选片段ids?final-plan在那里扮演什么角色?final-plan是否用于在索引解析后筛选出假阳性?

有时,我可以在查询计划中找到这一点:

代码语言:javascript
复制
<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两次?

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-28 10:12:55

经过进一步的研究和阅读,我决定总结一下我的发现。

注意事项:如果您不使用碎片,则“片段”的每一种用法都可以与“文档”相同。

部分计划与全部计划

partial-plan只是在进来时显示计划的增量部分,并且似乎主要是为了信息的使用。

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

选定的x片段

查询跟踪文档info-trace消息的含义提供了一些洞察:

有一个过滤的查询结果在info-trace中描述从查询处理的索引解析阶段返回了多少候选片段引用:

代码语言:javascript
复制
xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer")))
=> ...
<qry:info-trace>Selected 2 fragments to filter</qry:info-trace>

未过滤的查询记录相同的消息,但没有“要筛选”,这表示没有执行第二个筛选步骤:

代码语言:javascript
复制
xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer"), ("unfiltered")))
=> ...
<qry:info-trace>Selected 2 fragments</qry:info-trace>

qry:结果

代码语言:javascript
复制
<qry:result estimate="2"></qry:result>

estimate in qry:result显示了单独使用索引信息匹配查询的片段数。因此,这是过滤步骤之前的估计数,因此可能包含假阳性。我认为上面描述的估计值和信息跟踪日志总是一样的。

不同的注释示例

在启用唯一的element-word-query (禁用fast element word searches)的情况下,返回此final-plan

代码语言:javascript
复制
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

代码语言:javascript
复制
<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:搜索来控制。示例:

代码语言:javascript
复制
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"]/..)的日志消息可能如下所示:

代码语言:javascript
复制
<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"]);使用索引。

代码语言:javascript
复制
<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搜索和索引。这涵盖了我的许多问题,我真的可以推荐它。

票数 3
EN

Stack Overflow用户

发布于 2018-10-29 14:40:02

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53023665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档