问题描述
假设我在ML中有这样的元素:
<top-level-cote-mgt-rights>
<token>SUPPORT</token>
<token role="ADMIN">A/B/C</token>
<token role="APPROVER">A/B/C</token>
<token role="ADMIN">X/Y/Z</token>
<token role="APPROVER">X/Y/Z</token>
<token role="ADMIN">ADMIN/ONLY</token>
</top-level-cote-mgt-rights>
以下查询旨在查找标记元素,其值均为“ ADMIN / ONLY ”且角色属性为“ APPROVER ”
let $uris := cts:uris('',(),cts:and-query((
cts:collection-query('/test/data'),cts:element-query(xs:QName('top-level-cote-mgt-rights'),cts:element-query(xs:QName('token'),cts:and-query((
cts:element-attribute-word-query(xs:QName('token'),xs:QName('role'),'APPROVER',('exact')),cts:word-query('ADMIN/ONLY',('exact'))
))
)
)
)))
return fn:doc($uris)//one:top-level-cote-mgt-rights
它不应该返回任何结果,但是它确实会返回
<top-level-cote-mgt-rights xmlns="http://one.oecd.org/one">
<token>SUPPORT</token>
<token role="ADMIN">A/B/C</token>
<token role="APPROVER">A/B/C</token>
<token role="ADMIN">X/Y/Z</token>
<token role="APPROVER">X/Y/Z</token>
<token role="ADMIN">ADMIN/ONLY</token>
</top-level-cote-mgt-rights>
好像它在“令牌”值和“令牌”属性上分别匹配,但与我尝试实现的相同“令牌”不同。
我在做什么错了?
解决方法
在这种情况下,您会期望使用cts:element-query产生误报:cts:element-query实际上会确定要在其中查找封闭查询的匹配元素的范围。
我的理解是cts
以相关性/评分方式运行。
您可以使用查询跟踪来尝试/测试true
| false
是可组合查询(如果查询是直接的cts:element-attribute-value-query
,则不应期望误报)。
我建议两种解决方案:
使用本机XPath消除误报。
如果您希望采用MarkLogic方式,请尝试以下技术:
cts:search(
fn:collection("/test/data")//one:top-level-cote-mgt-rights,cts:near-query(
( cts:element-attribute-value-query(xs:QName("one:token"),xs:QName("role"),"APPROVER","exact"),cts:element-value-query(xs:QName("one:token"),"ADMIN/ONLY","exact")
),0
)
)
- 如果
case
无关紧要,请删除"exact"
。 - 您可以使用
word positions
索引对查询性能进行基准测试。