如何在Marklogic中对重复元素进行元素查询?
How to perform element query on a duplicate element in Marklogic?
抱歉,如果问题中的语法有误。
问题:
假设以下 XML 作为问题的示例 XML。
XML:
<publishers>
<aa>
<name>aaaaa</name>
<address>aaa addr</address>
</aa>
<bb>
<name>bbbb</name>
<address>bbb addr</address>
</bb>
</publishers>
我想在父元素为 <aa>
的 <name>
元素下执行搜索
但不应该考虑 <bb>
下的 <name>
元素
MarkLogic 中是否有任何方法可以做到这一点。
我知道执行此操作的几种方法(如下所列),但我正在寻找其他选择。
- 使用名称 space - 为
<aa>
和 <bb>
元素定义不同的名称 space 并使用 cts:element-value-query()
方法。
- 在
cts:search
中定义第一个参数为fn:doc()//aa
可能最简单的方法是使用 cts:element-query,它创建符合元素层次结构的查询。
在您的示例中,此查询将在属于 "aa" 元素的 "name" 元素中搜索您想要的任何名称,忽略其他地方的 "name" 元素。
cts:element-query(xs:QName("aa"),
cts:element-value-query(xs:QName("name"), "whatever")
)
当然 cts:element- 可以嵌套查询调用以创建更复杂的树约束。
另一种方法是使用 cts:path-range-query,
尽管这是否是一个好方法取决于你到底想做什么。对于要包含在搜索中的 aaa/name 个元素的每个路径,都需要一个范围索引。
cts:path-range-query("/publishers/aa/name", "=", "whatever")
您不清楚您是只想 return 元素的值还是只是用它来优化您的搜索条件。
另一种选择是使用一个字段并在那里定义路径,然后使用 field-value-query 或 field-word-query。如果您需要更高的性能,您仍然可以向该解决方案添加范围索引 after-the-fact.
抱歉,如果问题中的语法有误。
问题: 假设以下 XML 作为问题的示例 XML。
XML:
<publishers>
<aa>
<name>aaaaa</name>
<address>aaa addr</address>
</aa>
<bb>
<name>bbbb</name>
<address>bbb addr</address>
</bb>
</publishers>
我想在父元素为 <aa>
<name>
元素下执行搜索
但不应该考虑 <bb>
<name>
元素
MarkLogic 中是否有任何方法可以做到这一点。
我知道执行此操作的几种方法(如下所列),但我正在寻找其他选择。
- 使用名称 space - 为
<aa>
和<bb>
元素定义不同的名称 space 并使用cts:element-value-query()
方法。 - 在
cts:search
中定义第一个参数为fn:doc()//aa
可能最简单的方法是使用 cts:element-query,它创建符合元素层次结构的查询。
在您的示例中,此查询将在属于 "aa" 元素的 "name" 元素中搜索您想要的任何名称,忽略其他地方的 "name" 元素。
cts:element-query(xs:QName("aa"),
cts:element-value-query(xs:QName("name"), "whatever")
)
当然 cts:element- 可以嵌套查询调用以创建更复杂的树约束。
另一种方法是使用 cts:path-range-query, 尽管这是否是一个好方法取决于你到底想做什么。对于要包含在搜索中的 aaa/name 个元素的每个路径,都需要一个范围索引。
cts:path-range-query("/publishers/aa/name", "=", "whatever")
您不清楚您是只想 return 元素的值还是只是用它来优化您的搜索条件。
另一种选择是使用一个字段并在那里定义路径,然后使用 field-value-query 或 field-word-query。如果您需要更高的性能,您仍然可以向该解决方案添加范围索引 after-the-fact.