如何按cts:near-query规则统计匹配项,而非单独术语?
问题:按Near查询规则统计匹配项而非拆分术语
统计并高亮匹配术语时,现有代码将OVER和LOAD视为两个独立术语,但在near查询(OVER NEAR/1[ordered] LOAD)中,应将其视为单个匹配项OVERLOAD。请指导如何按near查询规则统计匹配项,而非拆分near查询中的单独术语?
现有代码
let $bindings := map:new() => map:with("", function($operator, $values, $options) { cts:word-query($values, ('wildcarded', 'case-insensitive'), 1) }) let $searchQuery := cts:parse($query,$bindings) let $docs := for $each in cts:search(fn:doc(),$searchQuery) let $matchCount := fn:count(fn:distinct-values(cts:walk($each, $searchQuery, $cts:text))) return <count>{$matchCount}</count> return $docs
解决方案
核心思路
cts:walk()会遍历并拆分查询中的每个独立词项,无法识别Near查询的连续匹配序列。要按Near规则统计,改用cts:matches(),它会把整个Near匹配序列算作一个单独实例。
修改后的统计代码
let $bindings := map:new() => map:with("", function($operator, $values, $options) { cts:word-query($values, ('wildcarded', 'case-insensitive'), 1) }) let $searchQuery := cts:parse($query,$bindings) let $docs := for $each in cts:search(fn:doc(),$searchQuery) let $matchCount := fn:count( cts:matches($each, $searchQuery, "case-insensitive", map{"include-context": false}) ) return <count>{$matchCount}</count> return $docs
高亮实现(可选)
如果需要同时高亮匹配内容,用cts:highlight()可以把整个Near匹配序列作为一个整体标记:
let $bindings := map:new() => map:with("", function($operator, $values, $options) { cts:word-query($values, ('wildcarded', 'case-insensitive'), 1) }) let $searchQuery := cts:parse($query,$bindings) let $docs := for $each in cts:search(fn:doc(),$searchQuery) let $highlighted := cts:highlight($each, $searchQuery, function($node, $matches) { <mark>{$node/node()}</mark> }) let $matchCount := fn:count(cts:matches($each, $searchQuery, "case-insensitive", map{"include-context": false})) return <result> <count>{$matchCount}</count> <content>{$highlighted}</content> </result> return $docs
关键说明
cts:matches()返回查询的所有匹配实例,Near查询的连续词序列会被当作一个匹配项计数,不会拆分。include-context设为false可以只返回匹配本身,避免额外的上下文内容干扰计数。
内容的提问来源于stack exchange,提问作者Pragya Kapoor
相关产品推荐
相关产品推荐

