开源搜索引擎,C++ 内核,原生支持语义搜索、向量搜索与地理搜索。可作为单一二进制文件运行,也可托管于 Typesense Cloud,体验类似 Algolia,且无按记录收费。
Typesense 的核心优势:原生向量搜索(无需单独的向量数据库)、内置地理搜索、对默认配置有明确主张(比 Algolia 少配置,比 Meilisearch 多一些)。
docker run -p 8108:8108 \
-v $(pwd)/typesense-data:/data \
-e TYPESENSE_API_KEY=your-strong-api-key \
-e TYPESENSE_DATA_DIR=/data \
typesense/typesense:latest \
--enable-cors
监听地址为 http://localhost:8108。健康检查:
curl http://localhost:8108/health
# {"ok":true}
单一二进制版本(无需 Docker):安装文档 ↗。
本教程以 Typesense Cloud 或单节点自托管为基础;Typesense 支持高可用集群,但那是另一套独立配置。
启动时设置的引导管理员密钥用于后端管理操作。应用代码中请创建作用域受限的密钥:
curl http://localhost:8108/keys \
-H 'X-TYPESENSE-API-KEY: your-strong-api-key' \
-H 'Content-Type: application/json' \
-d '{
"description": "Search-only key",
"actions": ["documents:search"],
"collections": ["*"]
}'
复制返回的 value,这就是你的客户端搜索密钥,可安全用于浏览器。API 密钥文档 ↗。
TYPESENSE_HOST=https://search.yourdomain.com
TYPESENSE_ADMIN_KEY=your-strong-api-key # 仅后端使用
TYPESENSE_SEARCH_KEY=xxxxxxxxxxxxxxxxxxxxx # 客户端安全可用
npm install typesense
与 Algolia / Meilisearch(从文档中自动推断 schema)不同,Typesense 需要明确定义 schema:
import Typesense from "typesense";
const client = new Typesense.Client({
nodes: [{ host: "localhost", port: 8108, protocol: "http" }],
apiKey: process.env.TYPESENSE_ADMIN_KEY,
});
await client.collections().create({
name: "posts",
fields: [
{ name: "title", type: "string" },
{ name: "body", type: "string" },
{ name: "tags", type: "string[]", facet: true },
{ name: "published_at", type: "int64" },
],
default_sorting_field: "published_at",
});
提前定义类型比自动推断模式工作量更大,但换来了更好的查询性能,以及数据不符合 schema 时的清晰报错。集合文档 ↗。
// 单条文档
await client.collections("posts").documents().create({
id: "post-123",
title: "How to deploy to Vercel",
body: "First, install the CLI...",
tags: ["deploy", "vercel"],
published_at: 1714521600,
});
// 批量导入(批次数据速度快得多)
const jsonl = posts.map(p => JSON.stringify(p)).join("\n");
await client.collections("posts").documents().import(jsonl, { action: "upsert" });
JSONL 批量导入可在单次请求中处理 10K+ 条文档。文档 API ↗。
// 后端或前端(使用仅搜索密钥)
const result = await client.collections("posts").documents().search({
q: "vercel deploy",
query_by: "title,body",
filter_by: 'tags:=["deploy"]',
sort_by: "published_at:desc",
per_page: 10,
});
console.log(result.hits);
query_by 指定搜索字段;filter_by 添加布尔过滤条件;sort_by 覆盖默认排序规则。
Typesense 内置向量搜索——嵌入、相似度、混合搜索——无需额外的向量数据库。
await client.collections().create({
name: "articles",
fields: [
{ name: "title", type: "string" },
{ name: "embedding", type: "float[]", num_dim: 384 },
],
});
// 混合搜索:关键词 + 向量
await client.collections("articles").documents().search({
q: "deployment strategies",
query_by: "title,embedding",
vector_query: "embedding:([0.1, 0.2, ...], k:10)",
});
在同一次查询中结合关键词匹配与语义相似度。向量搜索文档 ↗。
Typesense 还可通过内置模型自动生成嵌入向量——在 schema 中传入 embed 配置,Typesense 会自动从 OpenAI / Google PaLM / 开源模型获取嵌入。
内置经纬度支持——查找某点方圆 X 公里内的记录:
// Schema
{ name: "location", type: "geopoint" }
// Document
{ location: [37.7749, -122.4194] }
// 搜索"旧金山 5 公里以内"
await client.collections("places").documents().search({
q: "*",
filter_by: "location:(37.7749, -122.4194, 5 km)",
});
无需独立的地理数据库,可与文本搜索在同一次查询中协同使用。
Typesense 提供兼容 Algolia 的 InstantSearch 适配器,可直接复用相同的 React/Vue 组件:
npm install typesense-instantsearch-adapter react-instantsearch
import TypesenseInstantsearchAdapter from "typesense-instantsearch-adapter";
const adapter = new TypesenseInstantsearchAdapter({
server: {
nodes: [{ host: "search.yourdomain.com", port: 443, protocol: "https" }],
apiKey: process.env.NEXT_PUBLIC_TYPESENSE_SEARCH_KEY,
},
additionalSearchParameters: { query_by: "title,body" },
});
import { InstantSearch, SearchBox, Hits } from "react-instantsearch";
export function Search() {
return (
<InstantSearch searchClient={adapter.searchClient} indexName="posts">
<SearchBox />
<Hits hitComponent={({ hit }) => <div>{hit.title}</div>} />
</InstantSearch>
);
}
可直接替换 Algolia 的 searchClient。适配器仓库 ↗。
自托管:免费;你只需支付 VPS 费用(大多数项目约 $5–10/月)。
Typesense Cloud:小型集群起步约 $20/月。按集群规模线性扩展,不按记录收费。定价 ↗。
若与 Algolia 年费 $25K 的套餐相比,Typesense Cloud 大约只需 $2–3K——成本相差一个数量级。