MarkLogic - XQuery - cts:使用可变长度序列或映射的元素范围查询

时间:2015-05-19 14:19:27

标签: xquery marklogic

我收集了100,000条记录,结构如下:

<record>
    <pk>1</pk>
    <id>1234</id>
</record>
<record>
    <pk>2</pk>
    <id>1234</id>
</record>
<record>
    <pk>3</pk>
    <id>5678</id>
</record>
<record>
    <pk>4</pk>
    <id>5678</id>
</record>

我在id上设置了范围索引。

我想在XQuery中编写一个查询,允许我传入一个可变长度的序列或id的映射,然后用这些id返回所有记录。

我需要传递任意数量的id。此外,它需要利用范围索引(如快速)。

1 个答案:

答案 0 :(得分:1)

CTS搜索是你的朋友。他们会使用你的索引 您的CTS搜索有几个不同的选项。我的第一个想法是尝试这样的事情:

let $ids as xs:string* := (1, 2, 4, 5, 6, 33, 35.....89)
let $results as element(record)* := cts:search(/record,
    cts:element-value-query(xs:QName("id"), $ids, ("exact"))
    )
return $results
(: This will return all the record elements with their children :)

文档显示您可以将序列指定为cts:element-value-query中的第二个参数,并且您的序列本质上是可变长度。当您的序列传递到cts:element-value-query时,就好像说&#34; ID == 3或ID == 9或ID == 13&#34;等等。

http://docs.marklogic.com/7.0/cts:element-value-query

你也可以使用元素范围查询:http://docs.marklogic.com/7.0/cts:element-range-query,虽然我对那些不太好,所以我无法为你提供很多帮助。

请注意,在上面的代码中,我将id设为xs:string s。您当然可以将它们设为xs:integer,但无论哪种方式,它们都会在参数中传递时被解析为字符串。