Wag*_*ael 6 marklogic marklogic-9
我很难找到有关输出xdmp:plan
意味着什么的详细信息.
有这样一个简单的查询:
xdmp:plan(cts:search(doc(), cts:element-value-query(xs:QName("description"), "some text")))
Run Code Online (Sandbox Code Playgroud)
导致相当长的执行计划:
<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>
Run Code Online (Sandbox Code Playgroud)
提到文档的唯一部分xdmp:plan
是其文档本身.除此之外,我找不到任何其他东西.我想了解一些关于例如qry:key
或qry:annotation
真正含义的细节.
有没有我缺少的文件描述可能的输出xdmp:plan
.由于这是一个非常有价值的工具,以便了解查询性能,我希望它有很好的文档记录.
编辑:我发现的这个marklogic博客文章给出了一些如何解释查询计划的例子.
不过,我觉得自己像一个博客帖子应该不会是唯一合理的文档,这个工具.
我仍在思考一些问题:
partial-plan
和a 之间的区别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>
Run Code Online (Sandbox Code Playgroud)
qry:elem-word-trace
意思?<qry:ordering></qry:ordering>
?添加了关于对我的答案进行排序的简单描述./doc[id = 1]
输出以下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>
Run Code Online (Sandbox Code Playgroud)
经过更多搜索和阅读后,我决定总结我的发现。
注意:如果您不使用碎片,则“碎片”的每次使用都可以与“文档”同等对待。
Apartial-plan
只是显示了计划的增量部分,并且似乎主要仅供参考。
另一方面full-plan
是请求如何发送到索引,因此大多数时候是有趣的部分。
查询跟踪的文档提供了对消息含义的一些了解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>
Run Code Online (Sandbox Code Playgroud)
未过滤的查询会记录相同的消息,但没有“要过滤”,表明未执行第二个过滤步骤:
xdmp:plan(cts:search(doc(), cts:element-word-query(xs:QName("title"), "computer"), ("unfiltered")))
=> ...
<qry:info-trace>Selected 2 fragments</qry:info-trace>
Run Code Online (Sandbox Code Playgroud)
<qry:result estimate="2"></qry:result>
Run Code Online (Sandbox Code Playgroud)
in显示仅使用索引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>
Run Code Online (Sandbox Code Playgroud)
拥有两个单独的术语查询(一word("computer")
和一)element(title)
意味着它还将返回在 element 之外包含单词“computer”的文档title
。因此,未经过滤的搜索可能会返回误报。
具有两者element-word-query
并启用的返回: 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>
Run Code Online (Sandbox Code Playgroud)
这里annotation
表示元素内单词“computer”的组合搜索title
。在我的情况下,该查询可能未经过滤,并且仍然不会返回误报。
这篇博文中有更多详细信息。
该<qry:ordering>
标签指示生成的候选片段引用正在排序。这可以通过cts:search函数中的cts:order 构造函数之一进行控制。例子:
xdmp:plan(
cts:search(
doc(),
cts:element-word-query(xs:QName("title"), "computer"),
(cts:unordered())
))
=>....
<qry:ordering>
<qry:unordered></qry:unordered>
</qry:ordering>
Run Code Online (Sandbox Code Playgroud)
我一直想知道,如何查看索引是否被使用(用于查询执行计划,其中您有完整的索引扫描)。最终你可以很容易地判断是否使用了索引:
搜索<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>
Run Code Online (Sandbox Code Playgroud)
意思是除了步骤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>
Run Code Online (Sandbox Code Playgroud)
更多详细信息请参见此处。
如果有人找到有关如何解释和处理xmdp:plan
输出的更多信息,我很乐意了解。
2018 年 11 月 17 日更新:
发现这个非常有趣的视频,其中 Mary Holstege 谈论 MarkLogic 搜索和索引。这涵盖了我的很多问题,我真的可以推荐它。