如何使用Marklogic XQuery cts:search获取所需的数据
因此,我最近在Marklogic上接受了一家知名公司的采访。他问了我一个我无法回答的问题。下面是一个XML数据示例,如下所示 他问我,如何使用搜索仅获取员工id的如何使用Marklogic XQuery cts:search获取所需的数据,xquery,marklogic,Xquery,Marklogic,因此,我最近在Marklogic上接受了一家知名公司的采访。他问了我一个我无法回答的问题。下面是一个XML数据示例,如下所示 他问我,如何使用搜索仅获取员工id的zipcode为12345且州为加利福尼亚州?像cts:search 我想到的是写XPath,如下所示,但由于他使用搜索问我,我无法回答 let $x :=//employee/officeAddress[zipCode="38023"]/../employeeId/string() return $x xml数据
zipcode
为12345
且州为加利福尼亚州
?像cts:search
我想到的是写XPath,如下所示,但由于他使用搜索问我,我无法回答
let $x :=//employee/officeAddress[zipCode="38023"]/../employeeId/string()
return $x
xml数据集:
<employees>
<employee>
<employeeId>30004</employeeId>
<firstName>crazy</firstName>
<lastName>carol</lastName>
<designation>Director</designation>
<homeAddress>
<address>900 clean ln</address>
<street>quarky st</street>
<city>San Jose</city>
<state>California</state>
<zipCode>22222</zipCode>
</homeAddress>
<officeAddress>
<address>000 washington ave</address>
<street>bonaza st</street>
<city>San Francisco</city>
<state>California</state>
<zipCode>12345</zipCode>
</officeAddress>
<employee>
</employees>
30004
疯子
颂歌
经理
900净磅
夸克街
圣何塞
加利福尼亚
22222
华盛顿大街1000号
博纳扎街
旧金山
加利福尼亚
12345
对于许多熟悉XML技术并从MarkLogic开始的人来说,使用XPath是一个自然的初始想法。这是我刚开始做的事情
一些XPath表达式可以通过数据库进行优化并快速高效地执行,但也有一些XPath表达式不能也可能不能很好地执行
使用cts:search
和内置查询结构,可以优化利用索引的表达式,并允许您通过分析xdmp:plan
、xdmp:query meters
和xdmp:query trace
进一步优化
XPath的等效表达式是,在第一个$path
参数中指定/employees/employees
的路径,并在第二个$query
参数中与组合:
cts:search(/employees/employee,
cts:and-query((
cts:element-value-query(xs:QName("zipCode"), "12345"),
cts:element-value-query(xs:QName("state"), "California") )))/employeeId
您还可以使用更通用的$path
来搜索所有文档,并使用xdmp:element-query()
来包围cts:element-value-query
条件,将搜索限制为employee
元素的后代,然后将XPath限制为结果文档:
xpath我会尝试(未测试):
/employees/employee[officeAddress/zipCode='38023'和officeAddress/state='California']/employeeId/string()
注意,您也可以在xpath上使用xdmp:plan;与cts:search相比,看看它是如何工作的很有趣
一般来说,您最好尽可能多地使用cts:search而不是xpath(我喜欢xpath!)
这个问题有点模棱两可。一个文档中是否有多个员工?还是许多员工的文件?两者都有
另外,不要忘记添加适当的位置索引,否则您将不会得到太多未过滤的帮助。查看添加索引前后的计划
另见
cts:search(doc(),
cts:element-query(xs:QName("employee"),
cts:and-query((
cts:element-value-query(xs:QName("zipCode"), "12345"),
cts:element-value-query(xs:QName("state"), "California") ))
)
)/employees/employee/employeeId