精炼MarkLogic查询

时间:2018-02-02 07:22:10

标签: javascript marklogic marklogic-8

在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"))

如何优化此查询

感谢您的帮助

1 个答案:

答案 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 positionsattribute value positions。除了性能提升之外,如果你在cts.uris调用中使用near-query,这不是可选的 - cts.uris不会“过滤”传递的查询的结果,所以没有这些索引你仍然会得到误报。