MarkLogic - 使用搜索查询多个输入值 API
MarkLogic - Query for multiple input values using search API
MarkLogic 版本 9.0-6.2
我需要接受数组中的输入(比如说 PolicyId)和 return 集合中与 PolicyId 列表匹配的所有文档。在 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 并使其工作?我想通过一次数据库调用获取所有文档。
不要使用搜索 API,而是考虑使用 cts.parse(),它可以将多个值绑定到一个标签,如 PolicyId:(pol1, pol2, pol3)
有关详细信息,请参阅 cts.parse() 中带有 color:(red blue)
的示例:
http://docs.marklogic.com/guide/search-dev/cts_query#id_86861
此外,JSearch 提供了从 SJS(服务器端 JavaScript)搜索的辅助函数。欲了解更多信息,请参阅:
我可以使用 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 运算符连接起来,并能够取回所有匹配的文档。
MarkLogic 版本 9.0-6.2
我需要接受数组中的输入(比如说 PolicyId)和 return 集合中与 PolicyId 列表匹配的所有文档。在 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 并使其工作?我想通过一次数据库调用获取所有文档。
不要使用搜索 API,而是考虑使用 cts.parse(),它可以将多个值绑定到一个标签,如 PolicyId:(pol1, pol2, pol3)
有关详细信息,请参阅 cts.parse() 中带有 color:(red blue)
的示例:
http://docs.marklogic.com/guide/search-dev/cts_query#id_86861
此外,JSearch 提供了从 SJS(服务器端 JavaScript)搜索的辅助函数。欲了解更多信息,请参阅:
我可以使用 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 运算符连接起来,并能够取回所有匹配的文档。