You need to enable JavaScript to run this app. ArangoDB:从空格分隔输入生成多通配符PHRASE模糊搜索查询
优惠活动
大模型
产品
解决方案
定价
更多

ArangoDB:从空格分隔输入生成多通配符PHRASE模糊搜索查询

ArangoDB 动态多通配符搜索实现方案

核心场景需求

传入单个空格分隔的用户输入字符串(如"foo bar"),无需手动修改查询结构,自动匹配库中包含Foo Barber这类逐词对应的模糊命名结果,替代原本硬编码分词条件的固定写死模式。

动态条件生成逻辑

原本的查询需要手动写死每个分词对应的通配符节点,当用户输入的分词数量变化时就无法复用,完全可以通过ArangoAQL的内置字符串处理函数自动完成拆词、生成条件的全流程:

  1. 预处理输入字符串:去掉首尾多余空格,按空格拆分出独立查询词
    LET inputStr = TRIM("foo bar") // 自动清除输入首尾的冗余空格
    LET searchTokens = SPLIT(inputStr, " ") // 按空格拆分得到分词数组
    
  2. 批量生成通配符搜索结构:遍历拆分得到的分词,自动匹配PHRASE语法要求的节点格式
    LET wildcardSearchNodes = (
      FOR token IN searchTokens
      FILTER token != "" // 过滤连续空格拆分产生的空字符串,避免无效条件
      RETURN { WILDCARD: [CONCAT("%", token, "%")] }
    )
    
  3. 替换原查询里硬编码的条件数组,得到可动态适配任意输入长度的完整查询:
    LET inputStr = TRIM("foo bar")
    LET searchTokens = SPLIT(inputStr, " ")
    LET wildcardSearchNodes = (
      FOR token IN searchTokens
      FILTER token != ""
      RETURN { WILDCARD: [CONCAT("%", token, "%")] }
    )
    
    FOR doc IN movies 
      SEARCH PHRASE(doc.name, wildcardSearchNodes, "text_en") 
      RETURN doc
    

其他可选实现方向

  • 非相邻匹配场景:如果不要求分词必须在文本里相邻出现,只需要文档内容同时包含所有输入分词的模糊匹配结果,可以直接用FILTER配合CONTAINS/LIKE语法实现,不需要依赖全文索引:
    LET inputStr = TRIM("foo bar")
    LET searchTokens = SPLIT(inputStr, " ")
    FOR doc IN movies
      FILTER LENGTH(searchTokens) > 0 
         AND searchTokens ALL == CONTAINS(doc.name, CURRENT, true)
      RETURN doc
    
    这类实现的优点是对集合结构无额外要求,缺点是全表扫描的性能较差,不适合大数据量的场景。
  • 性能优化方向:如果当前模糊匹配采用前后双%的写法会导致全文索引无法发挥前缀优化效果,可以根据实际输入场景调整通配符位置——比如用户逐词输入的场景通常匹配的是内容开头的部分,就可以把通配符改成仅在后缀添加(即CONCAT(token, "%")),这类写法可以完全命中全文索引的性能优化,查询速度会有量级提升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 22:36:07