![](/img/trans.png)
[英]MarkLogic 8 - XQuery - cts:search - Change database programmatically
[英]How to get the data required using Marklogic XQuery cts:search
所以,我最近在 Marklogic 上接受了一家知名公司的采访。 他问了我一个我无法回答的问题。 有一个 XML 示例数据,如下所示。
他问我如何使用搜索仅获取zipcode
为12345
且state
是california
的员工 ID ? 喜欢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>
对于熟悉 XML 技术并从 MarkLogic 开始的许多人来说,使用 XPath 是一个自然的初步想法。 这是我刚开始时第一次开始做的事情。
一些XPath 表达式可以通过数据库进行优化并快速高效地执行,但也有一些不能也可能不会很好地执行。
使用cts:search
和内置查询构造可以优化表达式,利用索引,并允许您通过分析xdmp:plan
、 xdmp:query-meters
和xdmp:query-trace
来进一步调整。
XPath 的等效cts:search
表达式,在第一个$path
参数中指定/employees/employee
的路径,并在第二个$query
参数中将cts:element-value-query
与cts:and-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 放入结果文件:
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
xpath 我会尝试(未测试):
/employees/employee[officeAddress/zipCode = '38023' and officeAddress/state = 'California']/employeeId/string()
请注意,您也可以在 xpath 上使用 xdmp:plan; 看看它与 cts:search 是如何工作的很有趣。
一般来说,你最好在 cts:search 与 xpath (我喜欢 xpath)中尽可能多地投入。
这个问题有点模棱两可。 一份文件中有很多员工吗? 还是很多员工文件? 两个都?
另外,不要忘记添加适当的 position 索引,否则您将不会获得太多未经过滤的帮助。 查看添加索引前后的计划。
另请参阅https://help.marklogic.com/Knowledgebase/Article/View/queries-constrained-to-elements
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.