【问题标题】:MarkLogic - Query for multiple input values using search APIMarkLogic - 使用搜索 API 查询多个输入值
【发布时间】:2018-10-28 18:33:05
【问题描述】:

MarkLogic 版本 9.0-6.2

我的需要是接受数组中的输入(比如说 PolicyId)并返回集合中与 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。我如何传递一组 PolicyId 并使其工作?我想通过一次数据库调用获取所有文档。

【问题讨论】:

    标签: marklogic marklogic-9 marklogic-dhf


    【解决方案1】:

    考虑使用 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

    【讨论】:

      【解决方案2】:

      我可以使用如下所示的 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 运算符连接起来,并且能够取回所有匹配的文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        • 2018-10-01
        • 2016-07-25
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多