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

时间:2019-04-25 21:32:59

标签: marklogic marklogic-9

我的数据库中有一个字段,它的字段范围索引类型为 private ControllerContext CreateDummyControllerContext(string controllerName) { var context = new ControllerContext { HttpContext = new DefaultHttpContext { RequestServices = GetServiceProvider() }, RouteData = new RouteData { Values = {{"controller", controllerName}} }, ActionDescriptor = new Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor { RouteValues = new Dictionary<string, string>(), } }; return context; } // see https://codeopinion.com/using-razor-in-a-console-application/ private ServiceProvider GetServiceProvider() { var services = new ServiceCollection(); services.AddSingleton(PlatformServices.Default.Application); var environment = new HostingEnvironment { ApplicationName = Assembly.GetEntryAssembly().GetName().Name }; services.AddSingleton<IHostingEnvironment>(environment); services.Configure<RazorViewEngineOptions>(options => { options.FileProviders.Clear(); options.FileProviders.Add(new PhysicalFileProvider(Directory.GetCurrentDirectory())); }); services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>(); services.AddSingleton<DiagnosticSource>(new DiagnosticListener("Microsoft.AspNetCore")); services.AddLogging(); services.AddMvc(); return services.BuildServiceProvider(); } ,并且打开了xs:stringword searchestrailing 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甚至可以做到吗?

2 个答案:

答案 0 :(得分:1)

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

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

服务器确实支持对范围索引中的值进行模式匹配,但是Search API的查询文本语法中未提供此模式:

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

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

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

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

希望有帮助,

答案 1 :(得分:0)

不知道为什么它不起作用,但是我可能会为您提供解决方法。 我在范围约束中添加了一个名为*的存储桶,该存储桶选择了所有较大的内容,例如,将空字符串(这就是我猜的所有内容)都选择了。

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元素的文档。

另一个选项可能是使用an issue选项来添加一个序列化cts查询,该查询选择[not]包含您的元素的文档。这在我眼中将是更清洁的解决方案,因为水桶感觉有些。