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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:25:55