MarkLogic 9.0-6.2版
我需要接受数组中的输入(比如说PolicyId),并返回集合中与PolicyIds列表匹配的所有文档。元素范围索引是在PolicyId上创建的,我可以通过以下查询来执行此操作。该代码可以正常工作。
const PolList = ["pol1","pol2","pol3"]
cts.search(
cts.jsonPropertyRangeQuery("RegistrationId", "=",PolList)
)
现在,我正在尝试使用搜索API(search.search)进行同样的操作。我创建了一个选项文件并将其部署到模块数据库
{
"options":
{
"search-option": "unfiltered",
"additional-query":[
"<collection-query xmlns='http://marklogic.com/cts'>
<uri>registration</uri>
</collection-query>"
],
"constraint": [
{
"name": "policyId",
"range": {
"type": "xs:string",
"collation" : "http://marklogic.com/collation/codepoint",
"element": {"name": "PolicyId" }
}
}
],
"extract-document-data":
{
"selected": "all"
}
}
}
然后我正在使用下面的代码来获取文档。
const SearchOptions = fn.head(xdmp.invokeFunction(
function() {
return fn.doc("/Default/data-hub-FINAL/rest-
api/options/PolicyId.xml");
},
{
'database': xdmp.database('data-hub-MODULES')
}));
const result = fn.head(search.search('PolicyId:'+PolicyId,
SearchOptions.firstChild)).xpath('search:result/search:extracted/data()',
{'search': 'http://marklogic.com/appservices/search'});
此代码对于单个PolicyId正常工作。如何传递一个PolicyIds数组并使之工作?我想通过一个数据库调用来获取所有文档。
答案 0 :(得分:0)
考虑使用cts.parse()而不是使用Search API,它可以像PolicyId:(pol1, pol2, pol3)
那样将多个值绑定到标签
有关更多信息,请参见带有color:(red blue)
的cts.parse()示例:
http://docs.marklogic.com/guide/search-dev/cts_query#id_86861
此外,JSearch提供了用于从SJS(服务器端JavaScript)进行搜索的辅助功能。有关更多信息,请参见:
答案 1 :(得分:0)
我可以使用如下所示的OR运算符解决此问题。
const result = fn.head(search.search('PolicyId:'+PolicyId1 +' OR ' +PolicyId2,
SearchOptions.firstChild)).xpath('search:result/search:extracted/data()',
{'search': 'http://marklogic.com/appservices/search'});
我并没有完全传递一个列表,而是将输入PolicyId的列表与OR运算符连接在一起,并能够取回所有匹配的文档。