MarkLogic-使用搜索API查询多个输入值

时间:2018-10-28 18:33:05

标签: marklogic marklogic-9 marklogic-dhf

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数组并使之工作?我想通过一个数据库调用来获取所有文档。

2 个答案:

答案 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)进行搜索的辅助功能。有关更多信息,请参见:

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