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)搜索的辅助函数。欲了解更多信息,请参阅:

http://docs.marklogic.com/guide/search-dev/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 运算符连接起来,并能够取回所有匹配的文档。