【问题标题】:How to get the data required using Marklogic XQuery cts:search如何使用 Marklogic XQuery cts:search 获取所需的数据
【发布时间】:2021-01-09 13:35:59
【问题描述】:

所以,我最近在 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>

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    对于许多熟悉 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 进入结果文档(s):

    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
    

    【讨论】:

      【解决方案2】:

      我会尝试过的xpath(未测试):

      /employees/employee[officeAddress/zipCode = '38023' and officeAddress/state = 'California']/employeeId/string()

      请注意,您也可以在 xpath 上使用 xdmp:plan;看看它与 cts:search 的工作原理很有趣。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-29
        • 2021-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多