You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MarkLogic Search API:将cts:search()限定在JSON数组同一对象内的方法

问题

现有如下JSON数组结构:

"array": [
    {
      "id": "000-1111",
      "url": "http://test.com",
      "name": "Fred"
    },
    {
      "id": "000-1111",
      "url": "http://test.com",
      "name": "Joe"
    },
    {
      "id": "000-1111",
      "url": "http://test2.com",
      "name": "Sarah"
    },
    {
      "id": "000-1111",
      "url": "http://test3.com",
      "name": "Sam"
    }
]

需求是匹配数组中url和name完全匹配传入值的同一对象,但当前使用的cts查询会出现误报:当url和name分别属于数组中的不同对象时,查询仍会返回文档。当前使用的查询语句如下:

cts:search(fn:doc(), 
    cts:and-query((
      cts:json-property-value-query("url", "http://test3.com"),
      cts:json-property-value-query("name", "Sam")
    ))
) 

现有XPath方法fn:collection("mydata")[array[url="http://test3.com"][name="Sam"]]可以实现需求,但性能不佳。请问是否存在等价的高性能cts表达式,能将搜索范围限定在JSON数组的同一对象内?


解决方案

可以使用cts:json-property-scope-query将搜索范围限定在数组的单个元素(即JSON对象)内部,结合cts:and-query实现精准匹配,同时保留cts查询的索引高性能。具体表达式如下:

cts:search(fn:doc(),
  cts:json-property-scope-query("array",
    cts:and-query((
      cts:json-property-value-query("url", "http://test3.com"),
      cts:json-property-value-query("name", "Sam")
    ))
  )
)

原理说明:

  • cts:json-property-scope-query("array", ...) 把搜索范围锁定在array属性的每一个子节点(也就是数组中的每个JSON对象)内部。
  • 内部的cts:and-query要求在同一个数组元素中同时满足url和name的匹配条件,彻底避免跨对象的误报。
  • 该查询基于MarkLogic的索引执行,性能远优于XPath的后置过滤方式。

内容的提问来源于stack exchange,提问作者Tanner B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:15:36