MarkLogic中cts:search选项中哪个更好的collection()或根元素

时间:2018-11-08 16:57:31

标签: xquery marklogic

在我的一个项目中,MarkLogic顾问建议我在collection()中使用cts:search,在另一个项目中,ML顾问建议在cts:search中使用根元素。在两个项目中,我们拥有相同数量的文档。在性能方面哪个更好?

比方说,我们有一个文档(我准备拿一个小文档只是为了说明这种情况)。它具有名为“ demo”的集合:

<root>
<child1>ABC</child1>
<child2>DEF</child2>
<child3>GHI</child3>
<child4>JKL</child4>
</root>

哪种情况更好/更有效:

cts:search(/root, cts:and-query((....some cts:queries..)))

cts:search(collection("demo"), cts:and-query((....some cts:queries..)))

请帮助我解释一下哪个比另一个更好。

2 个答案:

答案 0 :(得分:6)

就搜索执行而言,它们都是单项查找,因此性能应该相同。

真正的区别在于您要如何管理内容。同一文档上可以有多个集合,因此可以用多种方式对同一内容进行切片,但只能有一个根元素。集合还使您可以抽象出文档结构的详细信息:同一集合中可以有多个不同的根元素。

答案 1 :(得分:1)

根据MarkLogic文档,“ MarkLogic的集合实现旨在优化针对大量文档的查询性能。”因此,这意味着您只能在大型数据库上识别出差异。

我试图通过实践来识别这一点,所以我创建了两个XQuery,一个带有集合,一个带有您建议的元素。但是,我将xdmp:query-trace(fn:true())放在了两个XQuery的顶部。我一个个地运行了两个查询,并分析了我的MarkLogic日志文件。

如果它是元素XQuery:

2018-11-12 15:16:58.448 Info: App-Services: at 5:12: xdmp:eval("declare namespace sem = &quot;http://marklogic.com/semantics&quo...", (), <options xmlns="xdmp:eval"><database>5310618057872024096</database>...</options>)
2018-11-12 15:16:58.448 Info: App-Services: at 5:12: Analyzing path for search: fn:collection()/sem:triples
2018-11-12 15:16:58.448 Info: App-Services: at 5:12: Step 1 is searchable: fn:collection()
2018-11-12 15:16:58.448 Info: App-Services: at 5:12: Step 2 is searchable: sem:triples
2018-11-12 15:16:58.448 Info: App-Services: at 5:12: Path is fully searchable.
2018-11-12 15:16:58.448 Info: App-Services: at 5:12: Gathering constraints.
2018-11-12 15:16:58.448 Info: App-Services: at 5:12: Step 2 contributed 1 constraint: sem:triples
2018-11-12 15:16:58.449 Info: App-Services: at 5:12: Search query contributed 1 constraint: cts:element-value-query(xs:QName("sem:object"), "taxonomy", ("lang=en"), 1)
2018-11-12 15:16:58.449 Info: App-Services: at 5:12: Executing search.
2018-11-12 15:16:58.464 Info: App-Services: at 5:12: Selected 65964 fragments to filter

,如果是集合XQuery:

2018-11-12 15:20:07.871 Info: App-Services: at 5:11: xdmp:eval("declare namespace sem = &quot;http://marklogic.com/semantics&quo...", (), <options xmlns="xdmp:eval"><database>5310618057872024096</database>...</options>)
2018-11-12 15:20:07.871 Info: App-Services: at 5:11: Analyzing path for search: fn:collection("/triples")
2018-11-12 15:20:07.871 Info: App-Services: at 5:11: Step 1 is searchable: fn:collection("/triples")
2018-11-12 15:20:07.871 Info: App-Services: at 5:11: Path is fully searchable.
2018-11-12 15:20:07.871 Info: App-Services: at 5:11: Gathering constraints.
2018-11-12 15:20:07.871 Info: App-Services: at 5:11: Step 1 contributed 1 constraint: fn:collection("/triples")
2018-11-12 15:20:07.875 Info: App-Services: at 5:11: Search query contributed 1 constraint: cts:element-value-query(xs:QName("sem:object"), "taxonomy", ("lang=en"), 1)
2018-11-12 15:20:07.875 Info: App-Services: at 5:11: Executing search.
2018-11-12 15:20:07.891 Info: App-Services: at 5:11: Selected 65964 fragments to filter

区别明显。如果我们使用集合查询,那么MarkLogic几乎会在单个步骤“ 1”中执行所有操作,但是如果是元素查询,那么MarkLogic会执行两个步骤。