如何使用Marklogic Search API排除指定元素执行文本搜索
问题描述
现有如下格式的XML文档:
<article> <contg>.....</contg> <bibliog>.....</bibliog> <indexg>.....</indexg> <fundg>.....</fundg> <citeg>....</citeg> </article>
需要使用Marklogic Search API执行文本搜索时,仅在<article>下的<contg>、<bibliog>、<indexg>、<fundg>这四个子片段中检索,排除<citeg>及其所有子元素。现有查询代码默认会搜索整个文档,需修改实现该范围限制。
修改方案
通过在搜索选项的additional-query中添加排除条件,结合原有的集合查询,即可实现目标。具体是利用cts:not-query排除<citeg>元素内的所有内容,修改后的完整代码如下:
let $SearchOption := <options xmlns="http://marklogic.com/appservices/search"> <term> <term-option>case-insensitive</term-option> <term-option>diacritic-insensitive</term-option> <term-option>whitespace-insensitive</term-option> <term-option>punctuation-insensitive</term-option> <search-option>unfiltered</search-option> <additional-query> { cts:and-query(( cts:collection-query("id_unicode"), cts:not-query(cts:element-query(xs:QName("citeg"), cts:true-query())) )) } </additional-query> <return-query>false</return-query> <return-metrics>true</return-metrics> <debug>false</debug> </term> </options> return search:search('search text',$SearchOption, 1, 10)
修改说明
- 原有的
cts:collection-query被放入cts:and-query中,与新增的排除条件组合,确保同时满足集合过滤和范围限制。 cts:not-query(cts:element-query(xs:QName("citeg"), cts:true-query()))表示排除所有<citeg>元素及其子元素内的内容,cts:true-query()用于匹配该元素下的任意内容。- 如果你的XML文档带有自定义命名空间,需要将
xs:QName("citeg")替换为带命名空间的QName,例如xs:QName("ns:citeg")(需提前绑定命名空间)。
内容的提问来源于stack exchange,提问作者Ajit V G
相关产品推荐
相关产品推荐

