文章目录
Orama:一个把全文搜索做成艺术品的开源搜索引擎
oramasearch/orama 在 GitHub 上已经累积到 10.4K Star。
这是个让我有点意外的项目。搜索引擎这东西,行业内其实早有定论,Elasticsearch 那套基础设施早就把市场占满了,能再做出个有竞争力的开源搜索引擎,本身就不太容易。但 Orama 偏要做,而且做到了。

它解决的核心问题就一个:在浏览器或者 Node 里跑搜索,又要全文检索,又要向量检索,还要混合检索。这事在以前是要拼凑好几个库才能干的,Orama 把它们压成了一个。
为什么这工具值得看
我个人觉得 Orama 真正有意思的点,在于它把搜索的复杂度往下压了一层。
你以前要给应用加搜索,要么上 Algolia 这种 SaaS,按调用次数掏钱,要么自己搭一个 Elasticsearch 集群,服务器成本不低,维护成本更高。Orama 是个 npm 包,安装完就能跑,数据完全在自己手里。这一层下来,搜索这件事的成本就直接被压没了。
它的功能覆盖也算完整。全文搜索、向量搜索、混合搜索都支持,还自带 BM25 排序、Typo Tolerance 容错、30 种语言的词干分词、地理搜索、Facets 聚合、字段加权、结果置顶。这些功能放在商业搜索服务里通常都是要单独付费的。

安装和使用
安装就一行:
bash
npm i @orama/orama
用法本身就两步:先定义 schema,再插入和搜索。
javascript
import { create, insert, search } from '@orama/orama'
const db = create({
schema: {
name: 'string',
description: 'string',
price: 'number',
meta: { rating: 'number' }
}
})
insert(db, {
name: 'Noise cancelling headphones',
description: 'Best noise cancelling headphones on the market',
price: 99.99,
meta: { rating: 4.5 }
})
const results = search(db, { term: 'Best headphones' })
搜索结果会直接返回 BM25 排序的命中项,带分数和原文档。从我看的示例输出,单次查询在 21 微秒级,这个量级放在边缘场景里是完全够用的。
向量搜索这块怎么说
Orama 从 v3 开始把向量搜索和混合搜索做成了内置功能,不用外挂任何向量数据库。Schema 里把字段标成 vector[1536],插入时带上 embedding 向量,搜索时设 mode: 'vector' 就行。
如果你嫌自己算 embedding 麻烦,它有官方的 @orama/plugin-embeddings 插件,底层用 TensorFlow.js,可以在插入数据时自动生成向量。要用 OpenAI 的模型,就配 @orama/plugin-secure-proxy,从客户端调 OpenAI 的 API 还能保持 key 不外泄。这层处理挺讨巧的,给想做 RAG 的人把脚手架都搭好了。
更有意思的是它的 Answer Engine
v3 之后 Orama 还做了 Answer Session,等于在自己造的搜索引擎之上,封装了一个类似 ChatGPT 或 Perplexity 的对话能力。配置完 Secure Proxy 插件,传入 OpenAI 的 chat 模型,就能让 Orama 基于索引出来的数据回答问题,附带原始文档引用。这玩意儿等于一个轻量级的本地 RAG 框架,特别适合想自己搭问答系统的团队参考。
谁适合用
我梳理了几类场景:
- 做中小型站点搜索、不想上 Elasticsearch 也不想付 Algolia 费用的开发者
- 在做 RAG 应用、需要一个轻量本地检索层的团队
- 搭文档站、想加全文搜索的 Vitepress、Docusaurus、Astro、Nextra 用户,官方都有对应插件
- 想在浏览器端直接跑搜索、不把数据传到后端的场景
许可证是 Apache 2.0,商业可用。插件生态也比较齐,embeddings、secure proxy、analytics、data persistence、qps、pt15 这些都有官方维护版本,框架集成插件覆盖了主流的几个文档站工具。
整体看下来,Orama 是那种「把事情做对了」的开源项目。代码量不大,功能取舍很克制,没想着自己包打天下,把向量计算、LLM 调用这些重活都交给了插件。要做 AI 时代本地化的搜索层,它至少是一个干净的起点。
。代码量不大,功能取舍很克制,没想着自己包打天下,把向量计算、LLM 调用这些重活都交给了插件。要做 AI 时代本地化的搜索层,它至少是一个干净的起点。