鉴于此文件:-
<items>
<item><type>T1</type><value>V1</value></item>
<item><type>T2</type><value>V2</value></item>
</items>
毫不奇怪,我发现这将以
cts:uris()
的方式拉回页面:cts:and-query((
cts:element-query(xs:QName('item'),
cts:element-value-query(xs:QName('type'),'T1')
),
cts:element-query(xs:QName('item'),
cts:element-value-query(xs:QName('value'),'V2')
)
))
但有些令人惊讶(至少对我来说),我也发现这也会:-
cts:element-query(xs:QName('item'),
cts:and-query((
cts:element-value-query(xs:QName('type'),'T1'),
cts:element-value-query(xs:QName('value'),'V2')
))
)
这似乎不正确,因为没有单个项目的 type = T1 和 value = V2 。
对我来说,这似乎是错误的肯定。
我是否误解了
cts:element-query
的工作原理?(我不得不说文档在这方面不是特别清楚)。
还是,MarkLogic 努力为我提供我期望的结果,并且如果我拥有更多或更好的索引,那么我不太可能得到错误的肯定匹配。
最佳答案
除了@wst的答案外,您只需要启用element value positions
即可从未经过滤的搜索中获得准确的结果。这里有一些代码来显示这一点:
xdmp:document-insert("/items.xml", <items>
<item><type>T1</type><value>V1</value></item>
<item><type>T2</type><value>V2</value></item>
</items>);
cts:search(collection(),
cts:element-query(xs:QName('item'),
cts:and-query((
cts:element-value-query(xs:QName('type'),'T1'),
cts:element-value-query(xs:QName('value'),'V2')
))
), 'unfiltered'
)
如果未启用
element value positions
,这将返回测试文档。启用位置后,查询将不返回任何内容。正如@wst所说,
cts:search()
默认运行过滤,而cts:uris()
(例如xdmp:estimate()
仅未过滤运行)。HTH!
关于xquery - MarkLogic cts :element-query false positives?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37398150/