我收集了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。此外,它需要利用范围索引(如快速)。
答案 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
,但无论哪种方式,它们都会在参数中传递时被解析为字符串。