我很难找到有关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>
经过一番搜索和阅读后,我决定总结一下我的发现。
注意:如果您不使用碎片,则每次使用“片段”都可以与“文档”相提并论。
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>
描述从查询处理的索引解析阶段返回的候选片段引用数:
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
进行两个单独的term-queries意味着它还将返回包含元素element-word-query
之外的单词“computer”的文档。因此,未经过滤的搜索可能会返回误报。
有一个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
表示在blog post元素内组合搜索单词“computer”。这个查询可能是未经过滤的,在我的情况下仍然没有返回误报。
更多详细信息在这个<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>
我总是想知道,如何查看是否使用了索引(用于查询执行计划,您需要完整的索引扫描)。最终,如果使用或不使用索引,您可以很容易地说出来:
搜索包含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>
的索引
here
进一步的细节可以找到xmdp:plan
。
如果有人发现有关如何解释和使用video输出的更多信息,我很乐意了解它。
更新17.11.2018:
发现这个非常有趣的qazxswpoi,其中Mary Holstege谈论MarkLogic搜索和索引。这涵盖了我的很多问题,我真的可以推荐它。
我还要补充一点,如果你在最终计划中看到一个没有注释的术语,那就是一个bug,你应该报告它。