ArangoDB:从空格分隔输入生成多通配符PHRASE模糊搜索查询
ArangoDB 动态多通配符搜索实现方案
核心场景需求
传入单个空格分隔的用户输入字符串(如"foo bar"),无需手动修改查询结构,自动匹配库中包含Foo Barber这类逐词对应的模糊命名结果,替代原本硬编码分词条件的固定写死模式。
动态条件生成逻辑
原本的查询需要手动写死每个分词对应的通配符节点,当用户输入的分词数量变化时就无法复用,完全可以通过ArangoAQL的内置字符串处理函数自动完成拆词、生成条件的全流程:
- 预处理输入字符串:去掉首尾多余空格,按空格拆分出独立查询词
LET inputStr = TRIM("foo bar") // 自动清除输入首尾的冗余空格 LET searchTokens = SPLIT(inputStr, " ") // 按空格拆分得到分词数组 - 批量生成通配符搜索结构:遍历拆分得到的分词,自动匹配PHRASE语法要求的节点格式
LET wildcardSearchNodes = ( FOR token IN searchTokens FILTER token != "" // 过滤连续空格拆分产生的空字符串,避免无效条件 RETURN { WILDCARD: [CONCAT("%", token, "%")] } ) - 替换原查询里硬编码的条件数组,得到可动态适配任意输入长度的完整查询:
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
相关产品推荐
相关产品推荐

