
最近有个同事跑过来问我我想在Confluence里一次性搜好几个项目空间的内容CQL应该怎么写他手里管着四五个业务空间每次找资料要么一个空间一个空间地切要么用全局搜索出来一大堆无关结果烦得不行。这个问题我太熟了。Confluence作为团队知识库用久了空间一定会越来越多研发一个空间、产品一个空间、技术运营一个空间、售前方案又一个空间。等你真要在这些空间里跨空间检索的时候默认搜索框的短板就全暴露出来了——它按全局索引走结果杂、排序乱、还不让你限定范围。CQLConfluence Query Language就是专门干这个的。它不是普通的关键词搜索而是一套结构化的查询语法你可以把它理解成给Confluence用的SQL。它能让你明确指定在哪些空间里查、按什么条件过滤、按什么字段排序。今天这篇就把用CQL指定多个Space检索这件事彻底讲透语法怎么写、参数怎么选、坑在哪里、遇到查不到的情况怎么排查。1. CQL到底解决什么问题为什么多Space检索会变成刚需1.1 先说清楚CQL和普通搜索的本质区别Confluence搜索框有两种模式。默认的那个搜索框你输入用户手册它全站搜标题、搜正文、搜附件能捞出一大堆但你要的是特定几个空间里的文档它没法精确圈定范围。CQL则完全不同。你把搜索语言切换到CQL模式后可以写出类似这样的语句space PROD AND text ~ 用户手册这句话的意思是只在PROD这一个空间里找正文或标题中包含用户手册的内容。当你有多个空间要查把条件扩展成下面这样就行space IN (PROD, SUPP, MKT) AND text ~ 用户手册前后对比一下就能看出来前者是大海捞针后者是圈定几个鱼塘再捞。这不是操作熟练度的问题是查询思路的根本区别——CQL把搜什么和在哪搜拆成了可以自由组合的条件普通搜索是把所有维度混在一锅汤里。1.2 多Space检索的三个典型场景场景一跨项目复用资料。比如公司有A、B、C三个项目空间你要找所有项目空间里关于性能测试方案的页面一条CQL就能同时扫描三个空间不用逐个切换。场景二跨部门找规范。市场部、售前部、产品部各自维护自己的空间但共同引用一套对外交付物规范。想在三个部门空间里同时检索交付物检查清单就需要用多Space条件把它们圈进来。场景三合并空间后的过渡期。团队刚把多个旧空间合并成新空间但旧内容还没迁完。这时候在CQL里同时列出新旧空间Key能保证过渡期检索不遗漏。这三个场景有一个共性知识分散在多个容器里但业务上需要把它们当作一个整体来查。CQL的多Space条件就是为这种跨容器检索设计的。1.3 先认识这几个基础概念在用CQL之前务必分清以下几个名词它们经常被混着说Space空间Confluence里的知识容器相当于一个项目组的内容仓库。Space Key空间Key空间的唯一英文缩写标识。看浏览器URL就知道——/display/ABC/页面标题里的ABC就是Space Key。也可以在空间设置 - 详情里查。Page页面空间里的具体文档。CQL字段空间的字段名是space页面的字段名是title、text、creator等。字段名要用英文字段值要用双引号包起来。搞清楚这些后面写条件才不会蒙。2. 多Space检索的语法拆解与选型思路2.1 最标准的写法space IN (...)多Space检索最推荐的写法就是IN运算符space IN (DEV, TEST, OPS) AND type page它和space DEV OR space TEST OR space OPS在语义上是等价的都是只要属于这三个空间之一就行。但IN的可读性明显更好尤其当空间数量超过三个时一眼就能看出是在哪些空间里查而不是在一串OR里数条件。我推荐IN的第二个原因是维护成本低。加一个空间就是在括号里加一个Key删一个就是删一个Key不容易破坏整条语句的结构。用OR写法时如果少写一个逗号或者在括号匹配上出了问题排查起来比IN麻烦得多。需要注意的是space这个字段匹配的是Space Key不是空间显示名称。空间显示名称可能叫产品需求文档中心或者研发-项目A但Key往往是一个简短英文缩写比如PDOC、PROJA。写错Key不会报错只是查不到任何东西——这一点后面单独说。2.2 用OR也能实现但你真的需要它吗有同事问那我直接用OR不行吗可行但要分场景。(space DEV OR space OPS) AND title ~ 部署这段的意思是在DEV或OPS空间里找标题含部署的页面。它和IN版本的结果一致。区别在于对比项space IN (...)多个OR条件可读性清晰一眼看到空间清单条件多时眼晕维护性增删空间很方便增删容易漏括号或逗号语法风险低括号内逗号分隔高括号层级容易出错与AND组合天然整体不需额外括号需要显式加括号保证分组结论很明确单纯指定多个Space用IN。只有当你的过滤条件中还有这个空间里查标题含某词另几个空间里查标签含某词这类差异化需求才需要拆开加括号用OR组合。多数人用不到这种复杂度。2.3 括号、引号、大小写三个最容易翻车的细节细节一逻辑运算符混用时必须加括号。CQL里AND优先级高于OR所以如果你写space DEV OR space OPS AND title 部署实际执行的是OPS空间里标题含部署加上DEV空间里的所有页面——这多半不是你想要的正确结果。正确写法是(space DEV OR space OPS) AND title 部署细节二字段值必须用双引号。space DEV是错的space DEV才对。只要是字符串类型的值都要带双引号。这个坑在中文内容检索时特别常见。细节三Space Key的大小写。Confluence的Space Key在创建时一般是大写英文缩写但系统匹配时通常不区分大小写。不过我个人还是习惯按规范大写写毕竟URL里显示的就是大写保持一致能少很多迷惑。一段查多个空间里标题含某词的完整示例space IN (PROD, SUPP, MKT) AND type page AND title ~ 用户手册这里的~是包含的意思。title 用户手册是精确匹配标题全文title ~ 用户手册是模糊匹配标题包含这些字。文本类条件用~才是搜索用通常精确等于一个完整短语才有效。3. 从一次真实查询出发完整实操与参数选择3.1 构造一条可复用的多Space检索语句假设我是知识库管理员运营着三个空间RD研发中心、QA测试中心、CS客户支持。现在需要统一检索三个空间里所有标题包含故障排查的页面要求只查页面、不查博客并且按最近更新时间倒序排。完整的CQL语句如下space IN (RD, QA, CS) AND type page AND title ~ 故障排查 ORDER BY lastmodified DESC拆开看每一步是干什么的space IN (RD, QA, CS)圈定检索范围三个空间一个不缺。AND type page过滤内容类型。Confluence里除了页面还有博客blogpost、评论comment、附件attachment等。如果不限定可能会混入博客或评论内容。AND title ~ 故障排查只查标题字段。这里如果希望也搜正文改成text ~ 故障排查即可但速度会稍慢。ORDER BY lastmodified DESC按修改时间倒序最新更新的排最前。实际使用中这条语句不需要换行可以一口气粘到CQL搜索框里。Confluence的高级搜索框右上角搜索 - 高级搜索或者搜索结果页左侧切换到CQL模式都能直接跑。3.2 搭配时间、人员、标签条件的进阶写法多Space条件只是第一步真实场景里往往还要叠加其他维度。只想找最近30天更新的内容space IN (RD, QA, CS) AND type page AND lastmodified lastModified(startOfDay(2024-11-01))Confluence支持相对日期函数也可以用lastmodified startOfDay(-30d)这类写法人性化不少。找特定人创建的内容space IN (RD, QA, CS) AND type page AND creator zhangsan找带特定标签的内容space IN (RD, QA, CS) AND type page AND label performance-test这些条件可以无限叠加。只要记住一条心法每叠加一个条件就是在结果集合上做一次收窄。写完之后可以自查一下——如果查询结果太少先去掉一两个限定如果结果太多再加限定。下面是一个综合实例把空间、类型、时间、关键词全组合起来space IN (RD, QA, CS) AND type page AND title ~ 发布 AND lastmodified startOfDay(-90d) ORDER BY lastmodified DESC含义是在三个空间里查最近90天内标题包含发布的页面按时间倒序。这个写法的好处是每个条件一行删减自如排查时也很直观。3.3 把CQL固化下来保存过滤器与宏嵌入手动输入CQL只适合临时查询。如果你每个月都要跑一遍找最近更新的跨空间文档建议直接把查询存成过滤器。在搜索结果页执行完CQL后点击保存为过滤器给它取个名字比如跨空间-最近更新文档。之后在页面上用过滤器宏或动态任务列表里引用这个过滤器就能把结果实时嵌入到任意页面里。仪表盘做法在Confluence仪表盘添加动态页面包含或过滤器宏选择你保存的过滤器这个宏会把匹配到的页面列表动态渲染出来。团队主页放一个这种宏等于自动维护一份所有空间最新文档列表不需要任何人手动更新。还可以用REST API在系统里跑CQLcurl -u username:password \ https://your-confluence.atlassian.com/wiki/rest/api/search?cqlspace%20IN%20(%22RD%22%2C%22QA%22%2C%22CS%22)%20AND%20type%3Dpagelimit20URL里直接用cql参数传查询语句需要做URL编码。这个方案适合定时任务、自动化脚本、内部小工具等场景能帮运维团队省不少事。4. 常见问题与排查技巧实录4.1 查得到和查不到之间隔着一个权限很多人问管理员能看到的内容普通用户搜不到是不是CQL写错了不是。Confluence的搜索结果天然受权限过滤。用户只能搜到对自己有查看权限的空间和页面这是一个隐式条件CQL里不需要也不能够关掉它。所以如果你替别人写好了CQL发给对方后他搜出来是空先让他在左侧导航里确认自己是否能直接进入那几个空间——进都进不去的空间CQL自然也会对其隐身。我踩过这个坑给测试部同事写了一个跨四个空间检索的CQL跑出来是空排查了半天发现他根本没有其中两个空间的查看权限把那两个从IN列表里去掉结果立刻正常了。4.2 Space Key输对了吗大小写、特殊字符与ID卡另一个高阶坑是这样的空间Key可能不是看起来那么直观的缩写。有些团队建空间时随便起名Key可能带数字、下划线甚至和显示名称毫无关系。比如显示名是技术文档中心Key实际是TDC_2024。出错场景我照着空间显示名写space 技术文档中心结果一个结果都没有。因为space字段匹配的是Key不是显示名。解决办法进入空间首页看浏览器URL。/display/TDC_2024/里的TDC_2024才是Key。或者空间设置 - 详情里看Space Key字段。把Key字母全大写Confluence创建时强制单字节字符一般习惯用大写填到IN里。顺带说一句个别空间Key是纯数字这样的特殊形式这时候在CQL里用双引号包住即可语法上和普通字符串没差别。4.3 明明有内容为什么结果还是空排查顺序建议按下面三条第一检查索引状态。Confluence后台任务的索引如果卡住或延迟新内容搜索不到。管理员去管理后台 - 内容索引查看索引状态必要时触发重建。第二确认字段写对。搜标题用title搜正文用text。text是全文本内容搜索包含了页面正文和附件文本但有时附件里的图片OCR、PDF扫描件内容是搜不到的这属于正常现象不属于CQL可解的范围。第三检查是否有隐性过滤条件叠加。有人把CQL写到某个宏里面时宏本身可能嵌套了仅当前空间之类的限制。页面上测试没问题但嵌入页面后范围突然变小先怀疑宏配置别只盯着CQL本身。4.4 多Space检索结果过多或超时怎么办当你一次性扫五六个空间且用text ~去搜正文结果集可能非常大页面加载会变慢。优化思路有三个优先用title ~代替text ~。标题字段的数据量比正文小一个数量级速度会有明显提升。加ORDER BY lastmodified DESC配合limit类限制。CQL搜索界面一般有每页条数设置REST API则用limit参数控制返回数量。拆分成多条查询。比如一周查一次全量其他时间用lastmodified startOfDay(-7d)只查增量。对日常运营来说增量查询就够了。5. 延伸视角CQL、全文检索与语义检索的关系5.1 CQL和关键词搜索的配合CQL解决的是检索的结构化问题它擅长把空间、类型、创建人、时间这些元数据组合成精确条件。但CQL本身对自然语言理解是没有的。你搜如何处理登录超时CQL只会在指定空间里按字面匹配登录超时这个字符串它不知道用户真正想问的是会话超时配置。所以日常知识管理里CQL通常和两种能力配合一种是全文检索的模糊匹配另一种是标签体系。多Space 关键词 标签这是大多数团队已经够用的检索公式。5.2 为什么知识库团队会想到RAG式检索近期很多人聊RAG检索增强生成和语义检索热度确实高。原理上用向量化表示把文本变成数值向量然后通过距离计算找语义相近的内容比CQL的字面匹配更懂人话。但RAG的底层逻辑并没有取代CQL这类精确检索两者互补。CQL负责把范围缩小——指定哪些空间、哪些类型、哪些时间范围语义检索负责在缩小的范围内做模糊匹配。没有前者向量模型在大知识库里召回很多无关片段没有后者CQL面对口语化检索词时无能为力。5.3 建议的组合拳我给团队做知识库检索方案时一般推荐三层组合第一层范围和权限控制用CQL的多Space条件锁定空间范围。第二层字段与标签过滤用类型、创建人、标签、时间等条件进一步收敛。第三层语义匹配如果部署了向量检索或RAG服务把第二层产生的候选集交给语义模型做排序和要点提取。这只是一个可选的架构参考不是每个团队都得上RAG。如果你的团队只有三五个空间、几百篇文档CQL多Space 全文检索就是最高效率的方案别为了追热度引入过度复杂的架构。最后分享一个我自己的使用习惯每季度检查一次空间架构把废弃空间归档把活跃空间的Key列成一张表存到知识库导航页面里。这样无论是写CQL还是给别人解释都有据可依。CQL多Space检索本身不难难的是对整体知识库有清晰的权属认知——知道文档分布在哪里、权限是谁的、哪些空间已经名存实亡。这些底层梳理得越清爽CQL写得越顺检索效率自然就上来了。