教程 / 后端集成 / 配置 Typesense 搜索
📝 文字 ● 中级 更新于 2026-05-13

配置 Typesense 搜索

开源搜索引擎,C++ 内核,原生支持语义搜索、向量搜索与地理搜索。可作为单一二进制文件运行,也可托管于 Typesense Cloud,体验类似 Algolia,且无按记录收费。

何时选择 Typesense

0
  • 选择 Typesense 的场景 — 你需要内置向量嵌入的开源搜索,已超出 Algolia 免费套餐限制,或搜索需求涉及地理位置(附近地点)或语义(基于语意的查询)。
  • 选择 Algolia — 零运维,界面精良,默认全球边缘节点。
  • 选择 Meilisearch — 形态相近,侧重点略有不同(Rust vs C++,部分开发体验有取舍)。
  • 选择 Postgres FTS — 记录数 ≤ 100K 且需求简单时。

Typesense 的核心优势:原生向量搜索(无需单独的向量数据库)、内置地理搜索、对默认配置有明确主张(比 Algolia 少配置,比 Meilisearch 多一些)。

使用 Docker 在本地运行

1
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):安装文档 ↗

生产环境:选择部署方式

2
  • 在 VPS 上自托管 — 与 Meilisearch 方案相同:systemd 服务单元,前置 Nginx + TLS。成本最低,需自行维护。
  • Typesense Cloud ↗ — 托管服务;集群支持自动扩缩容、全球边缘节点、7×24 支持。入门套餐约 $20/月。

本教程以 Typesense Cloud 或单节点自托管为基础;Typesense 支持高可用集群,但那是另一套独立配置。

创建 API 密钥

3

启动时设置的引导管理员密钥用于后端管理操作。应用代码中请创建作用域受限的密钥:

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     # 客户端安全可用

安装 SDK

4
npm install typesense

其他语言:Python、Ruby、PHP、Go、Java、.NET、Swift、Dart ↗

定义集合 Schema

5

与 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 时的清晰报错。集合文档 ↗

索引文档

6
// 单条文档
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 ↗

搜索

7
// 后端或前端(使用仅搜索密钥)
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 覆盖默认排序规则。

向量 / 语义搜索(内置)

8

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 / 开源模型获取嵌入。

地理搜索

9

内置经纬度支持——查找某点方圆 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)",
});

无需独立的地理数据库,可与文本搜索在同一次查询中协同使用。

InstantSearch UI 库

10

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适配器仓库 ↗

定价实况

11

自托管:免费;你只需支付 VPS 费用(大多数项目约 $5–10/月)。

Typesense Cloud:小型集群起步约 $20/月。按集群规模线性扩展,不按记录收费。定价 ↗

若与 Algolia 年费 $25K 的套餐相比,Typesense Cloud 大约只需 $2–3K——成本相差一个数量级。

Schema 比 Algolia/Meilisearch 更严格。 如果你向文档添加了一个字段,但 schema 中没有声明,Typesense 会直接拒绝该文档。这对生产环境的安全性有好处,但如果你习惯了"随便扔 JSON 进去"的方式,会觉得更受约束。请提前规划 schema,像对待数据库迁移一样认真对待它。

官方参考资料

下一步