如何使用Marklogic XQuery获取需要的数据cts:search

How to get the data required using Marklogic XQuery cts:search

所以,我最近在 Marklogic 上接受了一家知名公司的面试。他问了我一个我无法回答的问题。有一个 XML 示例数据,如下所示。

他问我你怎么能只得到 员工 IDzipcode12345statecalifornia 使用搜索?喜欢 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:planxdmp:query-metersxdmp:query-trace.

第二个 $query 参数中的等效 cts:search expression for the XPath, specifying the path to /employees/employee in the first $path parameter and combining cts:element-value-query with 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' 和 officeAddress/state = 'California']/employeeId/string()

请注意,您也可以在 xpath 上使用 xdmp:plan;看看它与 cts:search.

的工作原理很有趣

一般来说,相对于 xpath(我喜欢 xpath!),你最好尽可能多地投入 cts:search。

这个问题有点模棱两可。一份文件中有很多员工吗?还是很多员工文件?两个?

此外,不要忘记添加适当的位置索引,否则您将无法获得很多未经过滤的帮助。查看添加索引前后的计划

另见 https://help.marklogic.com/Knowledgebase/Article/View/queries-constrained-to-elements