如何在MarkLogic中使用xquery获取基于文件内容搜索的文件计数



我想根据文件内容中的一些值,使用XQuery从MarkLogic中的某个数据库中获得所有xml文件的计数。内容可以是XML结构中任何字段中的任何值。

的例子:

数据库中有5个结构相似的xml文件,其中一个xml字段<SubmissionUser>的值在所有文件中都是不同的。

<SystemRef>22000041</SystemRef>
<DateCreated>2022-09-06T19:07:46.3492849+01:00</DateCreated>
<TimeSaved>240</TimeSaved>
<Production>true</Production>
<Partner>CGI</Partner>
<MessageType>Invoice</MessageType>
<Fail>false</Fail>
<ManyReasons/>
<SubmissionUser>Rashmita</SubmissionUser>
<InternalBusinessUnit>Finance</InternalBusinessUnit>

我想获得SubmissionUser为Rashmita且InternalBusinessUnit为Finance的5个文件中那些文件的计数。我如何在MarkLogic中使用xquery实现这一点?

您可以使用cts:element-value-query()来搜索具有特定值的特定元素的文档,并将这两个元素的标准与cts:and-query()结合在cts:search()中。

如果你知道结果将相对较小,你可以count()cts:search()返回多少项。但是,如果您有一个非常大的数据库,并且可能返回数百万个项目,您可能会发现count()可能很慢。

因为这是一个相对简单的查询,不应该有假阳性和索引解析的问题。因此,使用xdmp:estimate()而不是count():

更快更有效。
xdmp:estimate(
cts:search(doc(), 
cts:and-query(( 
cts:element-value-query(xs:QName("SubmissionUser"), "Rashmita"),
cts:element-value-query(xs:QName("InternalBusinessUnit"), "Finance")
)) 
)
)

您也可以使用具有相同查询条件的cts:uris()并对uri进行计数:

count(
cts:uris("", (),
cts:and-query(( 
cts:element-value-query(xs:QName("SubmissionUser"), "Rashmita"),
cts:element-value-query(xs:QName("InternalBusinessUnit"), "Finance")
))
) 
)

最新更新