如何在Marklogic中对重复元素执行元素查询?

时间:2017-01-11 14:17:31

标签: indexing element marklogic

很抱歉,问题中的语法是错误的。

问题: 假设下面的XML是问题的示例XML。

XML:

<publishers>
    <aa>
        <name>aaaaa</name>
        <address>aaa addr</address>
    </aa>
    <bb>
        <name>bbbb</name>
        <address>bbb addr</address>
    </bb>
</publishers>

我想在父元素为<name>

<aa>元素下执行搜索

但它不应该考虑<name>

下的<bb>元素

MarkLogic有没有办法做同样的事情。

我知道几种方法(如下所列),但我正在寻找其他一些选择。

  1. 使用名称空间 - 为<aa><bb>元素定义不同的命名空间,并使用cts:element-value-query()方法。
  2. cts:search中将第一个参数定义为fn:doc()//aa

2 个答案:

答案 0 :(得分:2)

最简单的方法可能是使用 cts:element-query ,这会创建尊重元素层次结构的查询。

在您的示例中,此查询将搜索您想要的任何名称&#34; name&#34;属于&#34; aa&#34;元素,忽略&#34;名称&#34;其他地方的元素。

cts:element-query(xs:QName("aa"),
  cts:element-value-query(xs:QName("name"), "whatever")
)

当然cts:可以嵌套元素查询调用以创建更复杂的树约束。

另一种方法是使用 cts:path-range-query , 虽然这是否是一个好的方法取决于你究竟想要做什么。它需要一个范围索引,用于指向要包含在搜索中的aaa / name元素的每个路径。

cts:path-range-query("/publishers/aa/name", "=", "whatever")

答案 1 :(得分:0)

您不清楚是否只想返回元素的值,或者仅使用它来优化搜索条件。

另一种选择是使用字段并在那里定义路径,然后使用field-value-query或field-word-query。如果您希望获得更高的性能,您仍然可以在事后为此解决方案添加范围索引。