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

如何使用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数据

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

他问我,如何使用搜索仅获取员工id
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