Search 使用范围索引比较同一片段中的元素值

Search 使用范围索引比较同一片段中的元素值,search,marklogic,Search,Marklogic,在我的文档中,有两个元素(和)存在范围索引(相同类型)。我想要所有那些和值相同的文档。我知道使用cts:element-value-co-occurrencess()我可以从每个片段中提取和的值对,并比较这些值。但是我如何引用找到匹配项的片段呢?还是有更简单的方法?我只想使用范围索引。共现函数返回这两个元素的所有现有(片段内)值组合的列表。如果您只是查找元素a的值等于元素b的值的所有文档,您可以执行以下操作: for $v in cts:element-values(xs:QName("a"))

在我的文档中,有两个元素()存在范围索引(相同类型)。我想要所有那些值相同的文档。我知道使用
cts:element-value-co-occurrencess()
我可以从每个片段中提取的值对,并比较这些值。但是我如何引用找到匹配项的片段呢?还是有更简单的方法?我只想使用范围索引。

共现函数返回这两个元素的所有现有(片段内)值组合的列表。如果您只是查找元素a的值等于元素b的值的所有文档,您可以执行以下操作:

for $v in cts:element-values(xs:QName("a"))
return
    cts:search(
        collection(),
        cts:and-query((
            cts:element-value-query(xs:Qname("a"), $v),
            cts:element-value-query(xs:Qname("b"), $v)
        ))
    )
或者您可以使用
cts:uri
而不是
cts:search
来查找这些文档的数据库uri

添加:

以下评论中@mblakele的意思是:

let $query :=
    cts:or-query(
        for $v in cts:element-values(xs:QName("a"))
        return
            cts:and-query((
                cts:element-value-query(xs:Qname("a"), $v),
                cts:element-value-query(xs:Qname("b"), $v)
            ))
    )
return
    cts:search(
        collection(),
        $query
    )
这样可以避免执行cts:分别搜索每个值,并且可能执行得更快


谢谢。这应该可以。你也可以尝试用所有的和查询词构建一个大的或查询,这样你就可以调用
cts:search
。那应该更有效率。因此,不是每次循环执行时都要查找索引,而是只查找一次。@callow:yes。索引中有一个值查找。然后在循环中根据它们构建一个大的cts查询。只有在循环完成后,才能对索引执行最后一次大搜索。@grtjn顺便说一句,您可以给我指一个链接,该链接将详细解释共现函数及其用例。API文档说明cts:element-value-co-occurrencess()从指定的元素值词典中返回值共现(即,成对的值,它们都出现在同一个片段中)。但显然,它返回了这两个元素的所有现有值组合的列表。所以我有点困惑。另外,如果我,正如我最初打算的那样,希望从所有文档中找到(a,b)对的列表,因为它们存在于文档中,该怎么办?