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

问题描述 投票:2回答:1

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

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

document1.xml

<Person>
    <FirstName>Johnson</FirstName>
    <LastName>W</LastName>
    <EmailAddress>[email protected]</EmailAddress>
    <Neighbour>
        <FirstName>Mathew</FirstName>
        <LastName>Long</LastName>
    </Neighbour>
</Person>

document2.xml

<Person>
    <FirstName>Mathew</FirstName>
    <LastName>W</LastName>
    <EmailAddress>[email protected]</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级搜索。

任何帮助表示赞赏。

xquery marklogic
1个回答
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!

© www.soinside.com 2019 - 2024. All rights reserved.