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
相关产品推荐
相关产品推荐

