繁体   English   中英

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

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

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

他问我如何使用搜索仅获取zipcode12345statecalifornia员工 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:planxdmp:query-metersxdmp:query-trace来进一步调整。

XPath 的等效cts:search表达式,在第一个$path参数中指定/employees/employee的路径,并在第二个$query参数中将cts:element-value-querycts: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM