我的数据库中有一个字段,它的字段范围索引类型为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)
这将返回test.xml
,test2.xml
和test3.xml
,它们都具有test
元素。
虽然搜索"-(test:*)"
只返回test4.xml
,这是唯一没有test
元素的文件。
另一种选择可能是使用additional-query选项添加序列化的cts查询,该查询选择包含元素的文档[not]。这将是我眼中更清洁的解决方案,因为桶感觉有点hacky。
在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
希望有所帮助,