搜索语法以获取在 Marklogic 中没有字段的文档
Search Grammar for getting document that does not have the field in them in Marklogic
我的数据库中有一个字段,它有一个类型为 xs:string
的字段范围索引,并且我打开了 word searches
、trailing wildcard searches
和 field 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.xml
、test2.xml
和test3.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
希望对您有所帮助,
我的数据库中有一个字段,它有一个类型为 xs:string
的字段范围索引,并且我打开了 word searches
、trailing wildcard searches
和 field 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.xml
、test2.xml
和test3.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
希望对您有所帮助,