MarkLogic带约束的搜索返回错误结果问题求助
解决MarkLogic Search模块NE操作符返回所有文档的问题
这个问题我碰到过!核心原因是:当你用value约束配合NE(不等于)操作符时,如果没有给city字段建范围索引,MarkLogic没办法高效计算“不等于某个值”的结果,最终会退化为返回所有文档,这就不符合你的预期了。
下面给你两个不需要创建范围索引的解决方案,都能准确返回city不等于Atlanta的文档(如果原本只有2条匹配Atlanta,就会返回0条):
方案一:直接构造CTS查询(最直接)
放弃字符串查询的方式,直接用cts:not-query包裹cts:element-value-query来实现“不等于”逻辑,然后把这个CTS查询传给search:search的第一个参数。这种方式不需要任何额外索引,依赖默认的单词索引就能工作:
xquery version "1.0-ml"; import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; let $options := <options xmlns="http://marklogic.com/appservices/search"> <sort-order type="xs:string" collation="http://marklogic.com/collation/" direction="ascending"> <element ns="" name="userName"/> </sort-order> </options> let $query := cts:not-query(cts:element-value-query(xs:QName("city"), "Atlanta")) return search:search($query, $options)
原理是:先通过cts:element-value-query找到所有city等于Atlanta的文档,再用cts:not-query排除这些文档,剩下的就是符合要求的结果。
方案二:自定义约束(保留字符串查询语法)
如果你还是习惯用city NE Atlanta这种字符串查询语法,可以自定义一个custom约束,手动处理NE操作符的逻辑:
xquery version "1.0-ml"; import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; -- 自定义约束处理函数,判断操作符并生成对应的CTS查询 declare function local:city-constraint($query as element(search:query)) as cts:query* { let $value := $query/search:value/text() return if ($query/@operator = "ne") then cts:not-query(cts:element-value-query(xs:QName("city"), $value)) else cts:element-value-query(xs:QName("city"), $value) }; let $options := <options xmlns="http://marklogic.com/appservices/search"> <constraint name="city"> <custom facet="false"> <parse apply="parse-value" ns="" prefix="city"/> <constraint-fn>local:city-constraint</constraint-fn> </custom> </constraint> <sort-order type="xs:string" collation="http://marklogic.com/collation/" direction="ascending"> <element ns="" name="userName"/> </sort-order> </options> return search:search("city NE Atlanta", $options)
这个自定义约束会解析你的字符串查询,当遇到NE操作符时,自动生成“取反”的CTS查询,完美兼容你原来的查询语法,同时不需要范围索引。
内容的提问来源于stack exchange,提问作者marklogic_coder
相关产品推荐
相关产品推荐

