在MarkLogic中,如何找到元素为
的文档URI<sample-ref type="dated">
和匹配的值为1742
以下是示例XML文档:
<samples>
<sample>
<sample-ref type="dated">1742</sample-ref>
<sample-ref type="undated">1742</sample-ref>
<sample-xref type="sub">
<sample-ref type="dated">TT 1742</sample-ref>
</sample-xref>
<sample-xref type="din">
<sample-ref type="dated">
</sample-ref>
</sample-xref>
<sample-xref type="sup">
<sample-ref type="dated">XX 1742</sample-ref>
</sample-xref>
</sample>
</samples>
我只想查询值匹配1742
的元素<sample-ref type="dated">1742</sample-ref>
我已经尝试过这个查询,但它返回的是多个uri:
cts.uris("", null, cts.elementValueQuery(xs.QName("sample-ref"), "1742", "exact"))
如何优化此查询
感谢您的帮助
答案 0 :(得分:3)
您正在尝试查询包含sample-ref
元素的文档,该元素包含文本内容“1742”和值为“已过时”的type
属性。
也许你发现以下内容不起作用:
cts.elementQuery(xs.QName('sample-ref'), cts.andQuery([
cts.elementAttributeValueQuery(xs.QName('sample-ref'), xs.QName('type'), 'dated'),
cts.elementValueQuery(xs.QName('sample-ref'), '1742')
]))
因为事实证明,除了元素属性查询之外,元素查询中的元素查询只匹配后代,而不是后代或自我。
David Cassel在他的博客文章中记录了这个问题的一个解决方案:http://blog.davidcassel.net/2012/08/a-trick-with-ctsnear-query/
通过使用距离为0的cts.nearQueries,它会强制ML查找子查询与同一元素匹配的位置。
即
cts.uris("", null, cts.nearQuery([
cts.elementAttributeValueQuery(xs.QName('sample-ref'), xs.QName('type'), 'dated'),
cts.elementValueQuery(xs.QName('sample-ref'), '1742')
], 0))
博客文章提到,为了在索引上运行,您需要在数据库上打开两个索引:element value positions
和attribute value positions
。除了性能提升之外,如果你在cts.uris调用中使用near-query,这不是可选的 - cts.uris不会“过滤”传递的查询的结果,所以没有这些索引你仍然会得到误报。