模型 / 数据集
codelibs/fess avatar
codelibs/fess

Fess:用 OpenSearch 撑起的自托管企业搜索,以及它的边界在哪里

Open-source, self-hosted enterprise & site search server built on OpenSearch. Crawls web / file / DB / cloud sources, 20+ languages, REST API, and AI/RAG & semantic search. Apache-2.0.

1,134 个 Star175 个 ForkJavaApache-2.0

秒懂

它是什么?
Fess 把爬虫、权限过滤、管理界面和 OpenSearch 后端打包成一个可直接运行的搜索服务。本文只依据仓库与文档可见的信息,梳理它的抓取链路、部署方式,以及哪些场景它并不合适。
适合谁用?
如果你需要在内网对网站、文件系统或数据库做统一检索,并且要求权限过滤和现成的管理界面,Fess 值得先跑一遍 Docker Compose 再决定。反过来,如果你的需求只是给单个静态站点加一个搜索框,或者团队不愿意维护 OpenSearch 集群,那引入 Fess 就是过度设计。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Java(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

Fess 解决的到底是哪一类检索问题

企业内部的信息通常散落在三类地方:对外或对内的网站页面、共享盘里的 Office 与 PDF 文件、以及数据库或 SaaS 里的结构化记录。这三类内容的共同点是它们各自都有搜索入口,但没有一个统一的入口。Fess 的定位就是补上这个入口。它自带爬虫,从 web 站点、文件系统和数据存储中采集文档,把结果写进 OpenSearch,再由前台的搜索界面统一呈现。

README 里明确列出了数据源连接器的清单,包括 Confluence/Jira、Box、CSV、Database、Dropbox、Elasticsearch、Git、Gitbucket、G Suite、JSON、Office 365、S3、Salesforce、SharePoint 和 Slack。这个列表本身就是目标用户的画像:已经有多个 SaaS 或自建系统、需要跨系统检索、并且希望数据留在自己机房里的组织。

Fess Site Search 是另一条线,它把自己描述为 Google Site Search 的免费替代品,通过一段可嵌入的 JS 给自己的网站加搜索框。这一条线面向的是站点运营者,而不是企业内部 IT。两者共用同一个后端,但使用者的诉求差别很大。

爬虫、索引与查询之间的数据流

Fess 的架构可以拆成三段。第一段是采集:爬虫按配置去抓 web 页面、文件系统路径或数据源 API,抽取正文和元数据。第二段是索引:文档写入 OpenSearch,由 OpenSearch 负责底层的倒排索引、分片与查询执行。第三段是检索:前台界面或 REST API 接收查询,OpenSearch 返回结果,Fess 再叠加权限过滤、分面、排序和搜索建议。

这里有个设计选择值得说明。README 强调「prior OpenSearch knowledge is not required」,因为 Fess 把配置都收进了浏览器管理界面。抓取目标在 Admin UI 的 Web、File、Data Store 三类配置页里登记,爬取任务在 Scheduler 页面启动。这意味着运维人员不需要直接写 OpenSearch 的查询 DSL 或索引模板,代价是配置能力受限于 Fess 暴露出来的那些字段。

权限过滤是这套流程里比较关键的一环。README 提到支持基于角色和权限的结果过滤,以及 LDAP、OpenID Connect、SAML、SPNEGO 和 Microsoft Entra ID 的单点登录。也就是说,搜索结果不是全局可见的,而是按登录身份裁剪。这一点决定了 Fess 能不能用在有分级保密要求的环境里,也决定了接入时必须先把身份源对接好,否则过滤规则无从谈起。

多语言方面,README 说明界面和文本分析覆盖 20 种以上语言。文本分析依赖 OpenSearch 的分析器配置,具体每种语言的效果如何,README 没有给出细节,需要按自己的语料实测。

从下载到跑起来的实际命令

README 给出了两条路径。第一条是本地安装,下载页提供 DEB、RPM、ZIP 三种格式。以 ZIP 为例,命令是解压、进入目录、执行启动脚本:

unzip fess-<version>.zip cd fess-<version> ./bin/fess

第二条是 Docker。镜像发布在 ghcr.io 上,Docker Compose 文件在 codelibs/docker-fess 仓库的 compose 目录下。对只是想评估的人来说,Docker 这条路更省事,因为 README 说明 Docker 镜像里已经打包了 OpenSearch,而其他安装方式需要自己另外准备 OpenSearch。

启动之后有两个入口:搜索界面在 http://localhost:8080/,管理界面在 http://localhost:8080/admin/,默认用户名和密码是 admin/admin。这个默认凭据写在 README 里,任何对外可达的实例都必须先改掉。

运行环境方面,ZIP、RPM、DEB 三种包都要求 Java 21 或更高版本。从源码构建同样需要 Java 21 加 Maven。构建流程里有个容易被忽略的步骤:要先跑 mvn antrun:run 把 OpenSearch 插件下载到 plugins 目录,否则后续的打包和启动会缺依赖。出包用 mvn package,产物落在 target/releases;要生成 rpm 或 deb 则分别用 mvn rpm:rpm 和 mvn jdeb:jdeb。

健康检查走 REST API:curl -s "http://localhost:8080/api/v1/health",README 说就绪时会返回 JSON,启动过程最长可能要 60 秒。集成测试需要先启动 Fess 和 OpenSearch,再克隆 fess-testdata 仓库到 /tmp/fess-testdata,然后用 mvn test -P integrationTests 并传入 -Dtest.fess.url 和 -Dtest.search_engine.url 两个参数。

默认凭据、外部 OpenSearch 与集成测试的脆弱点

最直接的限制是默认账号。admin/admin 写在 README 里,属于公开信息。Fess 没有在文档中说明首次登录是否强制改密,所以部署方必须自己把这一步纳入流程。这不是 Fess 独有的问题,但它是这类自托管系统最常见的失守点。

第二个限制来自 OpenSearch 的耦合。非 Docker 安装需要自行准备 OpenSearch,README 只说「See the Installation Guide for supported versions and setup details」,并没有在仓库首页列出兼容版本矩阵。这意味着升级 Fess 或升级 OpenSearch 之前,必须去查安装指南确认版本对应关系,否则可能出现插件不匹配或索引格式不兼容。对于把 Fess 当长期基础设施维护的团队,这是一个持续存在的版本对齐成本。

第三点是集成测试对环境的依赖。测试要求本机跑着 Fess 和 OpenSearch,还要额外克隆 fess-testdata 仓库,并且 README 明确说 SearchApiTests 依赖这份测试数据。也就是说,想在 CI 里跑完整集成测试,需要先把这三个组件都拉起来,启动等待时间最长 60 秒。对于习惯快速反馈的流水线,这个开销不算小。

另外,README 在 Contributing 一节被截断,插件开发和主题定制的具体接口没有在首页材料中展开。如果你打算写自定义的数据源连接器,需要去翻对应的插件仓库,而不是指望主仓库的 README 讲清楚。

和直接使用 OpenSearch 相比,差别在哪

Fess 的底层就是 OpenSearch,所以最自然的替代方案是直接用 OpenSearch 加自建的采集与前端。两者的差别不在检索能力,而在检索之外的那一层。

直接用 OpenSearch,你需要自己解决:写爬虫抓网页和文件、做文档格式解析(Office、PDF、ZIP)、实现权限过滤、搭一个搜索界面、再搭一个管理后台。这些正是 Fess 打包好的部分。README 列出的插件体系也说明它把扩展点做成了独立仓库:数据源连接器各自一个仓库,主题在 fess-themes 里以 ZIP 形式上传安装,脚本引擎有 Groovy 和 OGNL,ingest 有 Logger 和 NDJSON。

代价是灵活性。Fess 的配置面被管理界面限定,你能调的参数是它暴露出来的那些。如果你的检索需求涉及高度定制的打分函数、复杂的查询重写,或者在索引阶段做非常规的文本处理,直接操作 OpenSearch 会更顺手。Fess 适合的是「标准企业搜索需求 + 不想自己造轮子」,而不是「把搜索引擎当成可编程组件」。

另一个方向是托管搜索服务。托管方案省掉了运维,但数据要出机房,这对有合规约束的组织往往不可接受。Fess 的价值主张恰恰在这里:数据、索引、身份全部留在自己控制的环境里。

许可、升级节奏与长期维护成本

Fess 使用 Apache-2.0 许可。这个许可允许商用、修改和再分发,附带专利授权条款,同时要求保留版权与许可声明。对大多数企业内部部署来说,义务主要落在保留声明这一项上。具体到你的分发方式是否触发额外义务,需要法务判断,这里不做结论。

版本节奏从发布记录看是稳定的:15.8.0 在 2026 年 8 月 20 日,15.7.0 在 2026 年 6 月 25 日,15.6.1 在 2026 年 5 月 2 日。大约两个月一个小版本的频率,意味着升级不是一次性工作。每次升级都要考虑前面提到的 OpenSearch 版本对齐问题,以及自定义插件是否需要跟着改。

维护成本的大头其实不在 Fess 本身,而在它依赖的那套东西:一个 OpenSearch 集群、一个 Java 21 运行时、以及若干数据源连接器。连接器越多,任何一个上游 API 变更都可能让某个数据源抓取失败。这部分工作量随接入系统的数量线性增长,不会因为 Fess 提供了管理界面而消失。

项目没有归档,主页是 fess.codelibs.org,文档、安装指南、管理指南都挂在那个站点上,而不是仓库 wiki 里。查资料时要注意区分 stable 路径下的文档和你实际部署的版本。

该不该上手,先验证什么

适合引入 Fess 的是这样一类团队:内网有多个内容源需要统一检索,对数据出机房有顾虑,有人力维护一个 OpenSearch 实例,并且能接受用管理界面而不是代码来配置抓取规则。数据源连接器清单里如果正好覆盖了你在用的系统,接入成本会明显下降。

不适合的情况同样清楚。只需要给一个静态站点加搜索框的,用 Fess Site Search 就够了,不必上整套服务端。检索逻辑需要深度定制的,直接基于 OpenSearch 开发更合适。没有余力维护 OpenSearch 集群的,托管方案虽然牺牲了数据控制权,但运维负担小得多。

真正动手前,按顺序验证这几项:先跑 Docker Compose 起一套完整环境,确认 OpenSearch 与 Fess 的版本搭配能正常工作;登录 http://localhost:8080/admin/ 后立刻改掉 admin 的默认密码;用 curl 打一次 http://localhost:8080/api/v1/health 确认服务就绪;然后挑一个真实数据源,在 Data Store 配置页里接上,跑一次爬取,检查权限过滤是否按预期裁剪结果。这四步走完,你基本能判断 Fess 是否匹配你的环境,而不需要先读完整套文档。

编辑结论

如果你需要在内网对网站、文件系统或数据库做统一检索,并且要求权限过滤和现成的管理界面,Fess 值得先跑一遍 Docker Compose 再决定。反过来,如果你的需求只是给单个静态站点加一个搜索框,或者团队不愿意维护 OpenSearch 集群,那引入 Fess 就是过度设计。上手前必须先确认三件事:OpenSearch 的版本与 Fess 的兼容性(README 只说明 Docker 镜像自带 OpenSearch,其他安装方式要自行准备)、Java 21 的运行时是否就绪,以及默认的 admin/admin 账号是否已在第一次登录后修改。

官方来源

  1. codelibs/fess on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
社区笔记

社区笔记