我的数据库中有一个字段,它的字段范围索引类型为 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: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
甚至可以做到吗?
答案 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.xml
,test2.xml
和test3.xml
,它们都有一个test
元素。
搜索"-(test:*)"
时仅返回test4.xml
,这是唯一没有test
元素的文档。
另一个选项可能是使用an issue选项来添加一个序列化cts查询,该查询选择[not]包含您的元素的文档。这在我眼中将是更清洁的解决方案,因为水桶感觉有些。