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

MarkLogic - XQuery - cts:element-range-query using variable length sequence or map

我收集了 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。此外,它需要利用范围索引(如快速)。

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 时,就好像在说 "ID==3 OR ID==9 OR ID==13",等等

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

您也可以使用元素范围查询:http://docs.marklogic.com/7.0/cts:element-range-query,虽然我不太擅长这些,所以我不能在这方面给您太多帮助。

请注意,在我上面的代码中,我将 ID 设置为 xs:strings。您当然可以将它们作为 xs:integers,但是无论哪种方式,当传入参数时它们都会被解析为字符串。