限制搜索cts的扩展:element-value-search- Marklogic

时间:2018-02-27 10:41:11

标签: xquery marklogic

我正在使用cts:element-value-search来根据参数搜索文档。虽然查询工作正常但我希望它只搜索直接子元素中的元素。

对于Ex。我的文档树看起来像这样

document1.xml

<Person>
    <FirstName>Johnson</FirstName>
    <LastName>W</LastName>
    <EmailAddress>john@abc.com</EmailAddress>
    <Neighbour>
        <FirstName>Mathew</FirstName>
        <LastName>Long</LastName>
    </Neighbour>
</Person>

document2.xml

<Person>
    <FirstName>Mathew</FirstName>
    <LastName>W</LastName>
    <EmailAddress>john@abc.com</EmailAddress>
    <Neighbour>
        <FirstName>Anderson</FirstName>
        <LastName>Long</LastName>
    </Neighbour>
</Person>

我的查询是

cts:search(
  /Person,
  cts:and-query((
      cts:element-value-query(xs:QName("FirstName"), concat('*', "son", '*'), 
        ("wildcarded", "case-insensitive", "whitespace-sensitive", "punctuation-sensitive"))
  )),
  ()
)

这将返回两个文档,因为它与第一个文档匹配<FirstName>Johnson</FirstName>

和第二个匹配的文件

<FirstName>Anderson</FirstName>

位于较低级别。

我不想要第二个结果,并希望查询仅在1级搜索。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用cts:element-querycts:json-property-scope-query将子查询范围限定为特定的容器元素或属性。这些将减少与特定祖先的子查询匹配。

然而,

cts:element-query(xs:QName('Person'), cts:element-value-query(xs:QName('Firstname', ...))是不够的,因为Neighbour/Firstname也是后代。

最简单的选择是在Person/Firstname上使用路径范围索引。这是迄今为止最直接的解决方案。

HTH!