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

Search Grammar for getting document that does not have the field in them in Marklogic

我的数据库中有一个字段,它有一个类型为 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 有可能吗?

不确定为什么它不起作用,但我可能有适合您的解决方法。 我在范围约束中添加了一个名为 * 的桶,它选择所有更大的 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)

这个returnstest.xmltest2.xmltest3.xml都有一个test元素。

在仅搜索 "-(test:*)" returns 时,test4.xml 是唯一没有 test 元素的文档。

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

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

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

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

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

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

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

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

您可以设置一个自定义约束,它采用 pmid:true 或 pmid:false 查询文本并执行适当的 cts:json-属性-scope-query()

有关详细信息,请参阅:

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

希望对您有所帮助,