在Marklogic中搜索语法以获取其中没有字段的文档

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

我的数据库中有一个字段,它的字段范围索引类型为xs:string,我打开了word searchestrailing wildcard searchesfield value searches

以下是我的样本选项

  <options xmlns="http://marklogic.com/appservices/search">
 <constraint name="pmid">
          <range type="xs:string" facet="false">
            <field name="wos_pmid"/>
        </range>
    </constraint>
    <term>
        <term-option>case-insensitive</term-option>
        <term-option>punctuation-insensitive</term-option>
        <term-option>whitespace-insensitive</term-option>
        <term-option>wildcarded</term-option>
    </term>
    <transform-results apply="empty-snippet"/>
</options>

当我做(pmid:*)我没有得到任何结果,但它应该向我显示所有记录中有node,并且当我做-(pmid:*)时,它显示所有文件而不是只有文件中没有node

甚至可能与fields我想做什么?

marklogic marklogic-9
2个回答
0
投票

不知道为什么它不起作用但我可能有一个解决方法给你。我在一个范围约束中添加了一个名为*的存储桶,它选择了更大的空字符串eqauls(这是我猜的全部)。

xquery version "1.0-ml";

xdmp:document-insert('test.xml', <doc><test>hello world</test></doc>);
xdmp:document-insert('test2.xml', <doc><test>hello world 2</test></doc>);
xdmp:document-insert('test3.xml', <doc><test></test></doc>);
xdmp:document-insert('test4.xml', <doc></doc>);

import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

let $options := 
<options xmlns="http://marklogic.com/appservices/search">
   <constraint name="test">
       <range type="xs:string">
            <field name="test"/>
            <bucket ge="" name="*"></bucket>
       </range>
   </constraint>
   <term>
        <term-option>case-insensitive</term-option>
        <term-option>punctuation-insensitive</term-option>
        <term-option>whitespace-insensitive</term-option>
        <term-option>wildcarded</term-option>
   </term>
   <transform-results apply="empty-snippet"/>
</options>

return search:search("test:*", $options)

这将返回test.xmltest2.xmltest3.xml,它们都具有test元素。

虽然搜索"-(test:*)"只返回test4.xml,这是唯一没有test元素的文件。

另一种选择可能是使用additional-query选项添加序列化的cts查询,该查询选择包含元素的文档[not]。这将是我眼中更清洁的解决方案,因为桶感觉有点hacky。


1
投票

在Search API中,通配符搜索使用单词或值查询而不是范围查询:

http://docs.marklogic.com/guide/search-dev/wildcard#id_74842

服务器支持对范围索引中的值进行模式匹配,但这不会在Search API的查询文本语法中公开:

http://docs.marklogic.com/cts.valueMatch

也就是说,如果我理解正确,目标是测试节点的存在与否。如果是,则这是与通配符查询不同的查询,该查询匹配部分文本值。

一种方法是使用cts:json-property-scope-query()(或cts:element-query(),如果搜索XML),使用cts:true-query()或cts:false-query()as子查询,如:

cts:json-property-scope-query("pmidPropertyKey", cts:true-query())

您可以设置一个自定义约束,该约束采用pmid:true或pmid:false查询文本并执行相应的cts:json-property-scope-query()

有关更多信息,请参阅:

http://docs.marklogic.com/cts:json-property-scope-query

希望有所帮助,

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